Im Handbuch wird die Verbindung nach Abschluss jeder Abfrage geschlossen. Wenn es also mehrere Datenbankoperationen gibt, führt dies zu einer ständigen Generierung und Freigabe von Verbindungen. Ist das nicht unvernünftig?
Zum Beispiel gibt es eine.php, die 20 Funktionen enthält, von denen jede 20 Objekte instanziieren muss, und jedes Objekt verfügt über Datenbankoperationen.Es gibt also drei Methoden:
1. Erhalten Sie eine Datenbankverbindung in jeder Klasse von 20 Objekten, der Vorgang wird abgeschlossen und geschlossen.
2. Rufen Sie die Datenbankverbindung in a.php ab, übergeben Sie die Verbindungsparameter in jeder Funktion und geben Sie sie schließlich in a.php frei.
3. Generieren Sie ein statisches Datenbankverbindungsobjekt und rufen Sie ConnectionClass::db
in jeder Klasse auf
.
Antwortinhalt:
Zum Beispiel gibt es eine.php, die 20 Funktionen enthält, von denen jede 20 Objekte instanziieren muss, und jedes Objekt verfügt über Datenbankoperationen.
Es gibt also drei Methoden:
1. Erhalten Sie eine Datenbankverbindung in jeder Klasse von 20 Objekten, der Vorgang wird abgeschlossen und geschlossen.2. Rufen Sie die Datenbankverbindung in a.php ab, übergeben Sie die Verbindungsparameter in jeder Funktion und geben Sie sie schließlich in a.php frei.
3. Generieren Sie ein statisches Datenbankverbindungsobjekt und rufen Sie ConnectionClass::db
in jeder Klasse auf
Was besser ist, besprechen Sie es bitte.
.
Durch die Verwendung einer statischen Variablen zum Speichern der Datenbankverbindung können mehrere Funktionen nur einmal in einer Anfrage eine Verbindung zur Datenbank herstellen.
Wenn Sie dauerhafte Verbindungen aktivieren, können Sie einen PHP-FPM-Prozess erreichen, der eine Datenbank in mehreren Anfragen teilt . Die Datenbank ist verbunden.
<code><?php function db() { static $db; //静态变量 if ($db) { return $db; } else { $db = new mysqli('p:127.0.0.1','user','pass','dbname',3306); return $db; } } function foo1() { return db()->query('SELECT * FROM table1')->fetch_all(); } function foo2() { return db()->query('SELECT * FROM table2')->fetch_all(); } var_export( foo1() ); var_export( foo2() );</code>
Ich weiß nichts über andere Datenbanken, aber MySQL unterstützt dauerhafte Verbindungen.
<code><?php header('Content-Type: text/plain; charset=utf-8'); function db() { static $db; //静态变量 if ($db) { return $db; } else { $db = uniqid(mt_rand(), true); return $db; } } function foo1() { return db(); } function foo2() { return db(); } echo foo1()."\n"; echo foo2()."\n";</code>
Eine kontinuierliche Verbindung schließt die vorherige Datenbankverbindung nicht und die vorherige Verbindung wird direkt für die nächste Verbindung verwendet.
MySQLi
verfügt nicht über eine -Funktion ähnlich wie MySQL, aber Sie können beim Herstellen einer Verbindung vor dem Hostnamen hinzufügen. Weitere Informationen finden Sie auf der offiziellen PHP-Website: MySQLi-Erweiterung und dauerhafte Verbindung. Danke an @eechen für die Korrektur. pconnect()
p:
Im Gegensatz zur MySQL-Erweiterung bietet MySQL keine spezielle Methode zum Öffnen einer dauerhaften Verbindung. Wenn Sie eine dauerhafte Verbindung herstellen müssen, müssen Sie beim Herstellen der Verbindung p: vor dem Hostnamen hinzufügen.
PDO unterstützt auch lange Verbindungen: Verwenden Sie
) im vierten Parameter des neuen PDO, siehe offizielles PHP-Handbuch – PDO-Verbindung und Verbindungsverwaltung Beispiel4.
array(PDO::ATTR_PERSISTENT
3Bah, es besteht kein Grund, darüber zu diskutieren. Normalerweise verwenden DB-Objekte den Singleton-Modus, was bereits Konsens ist.
Ich persönlich denke, dass 2 das Beste ist.
Sie können auch die Verwendung eines Verbindungspools in Betracht ziehen
https://www.baidu.com/s?wd=ph...
Ich denke auch, dass 3 den Singleton-Modus unterstützt
Ich weiß nicht, wie ich diese Antwort schreiben soll.
Eine Menge Dinge: Objekte, Destruktoren, Singletons, Abhängigkeitsinjektion, dauerhafte VerbindungenEndlich wurde mir plötzlich klar, dass dies nicht schwierig ist, ich habe es analysiert und verstanden, wie zum Beispiel Phalcon. von.