Heim  >  Artikel  >  Backend-Entwicklung  >  Permanente PHP-Datenbankverbindung

Permanente PHP-Datenbankverbindung

伊谢尔伦
伊谢尔伦Original
2016-11-22 10:23:011435Durchsuche

Eine permanente Datenbankverbindung bezieht sich auf eine Verbindung, die nicht geschlossen wird, wenn die Ausführung des Skripts abgeschlossen ist. Wenn eine Anfrage für eine dauerhafte Verbindung eingeht. PHP prüft, ob bereits eine identische dauerhafte Verbindung besteht (die zuvor geöffnet wurde). Wenn sie vorhanden ist, wird die Verbindung direkt verwendet. Wenn sie nicht vorhanden ist, wird eine neue Verbindung hergestellt. Die sogenannte „gleiche“ Verbindung bezieht sich auf eine Verbindung zum selben Host unter Verwendung desselben Benutzernamens und Passworts.

Leser, die die Funktionsweise von Webservern und verteilter Last nicht vollständig verstehen, verstehen möglicherweise die Rolle dauerhafter Verbindungen falsch. Insbesondere bietet eine dauerhafte Verbindung weder die Möglichkeit, eine „Benutzersitzung“ auf derselben Verbindung einzurichten, noch bietet sie die Möglichkeit, effektiv eine Transaktion einzurichten. Tatsächlich bietet eine permanente Verbindung streng genommen keine besonderen Funktionen, die eine nicht persistente Verbindung nicht bietet.

Warum?

Das hat mit der Funktionsweise des Webservers zu tun. Es gibt drei Möglichkeiten, wie ein Webserver PHP zum Generieren von Webseiten verwenden kann.

Die erste Methode besteht darin, PHP als „Shell“ zu verwenden. Wenn PHP auf diese Weise ausgeführt wird, erzeugt und beendet es einen PHP-Interpreter-Thread für jede PHP-Seitenanfrage an den Webserver. Da dieser Thread mit dem Ende jeder Anforderung endet, werden alle in diesem Thread verwendeten Ressourcen (z. B. Verbindungen zu einem SQL-Datenbankserver) mit dem Ende des Threads geschlossen. In diesem Fall ändert die Verwendung dauerhafter Verbindungen nichts, da diese überhaupt nicht dauerhaft sind.

Die zweite und häufigste Methode ist die Verwendung von PHP als Modul in einem Multiprozess-Webserver, der derzeit nur mit Apache funktioniert. Bei einem Multiprozessserver besteht das typische Merkmal darin, dass ein übergeordneter Prozess und eine Gruppe von untergeordneten Prozessen koordiniert ausgeführt werden, wobei der untergeordnete Prozess tatsächlich die Webseite generiert. Immer wenn ein Client eine Anfrage an den übergeordneten Prozess stellt, wird die Anfrage an den untergeordneten Prozess weitergeleitet, der nicht durch andere Client-Anfragen belegt ist. Dies bedeutet, dass, wenn derselbe Client zum zweiten Mal eine Anfrage an den Server stellt, diese möglicherweise von einem anderen untergeordneten Prozess verarbeitet wird. Nach dem Öffnen einer dauerhaften Verbindung können alle nachfolgenden Seiten, die den SQL-Dienst anfordern, die hergestellte SQL Server-Verbindung wiederverwenden.

Die letzte Methode besteht darin, PHP als Plugin für einen Multithread-Webserver zu verwenden. Derzeit unterstützt PHP 4 bereits ISAPI, WSAPI und NSAPI (unter Windows-Umgebung), wodurch PHP als Multithread-Webserver wie Netscape FastTrack (iPlanet), Microsofts Internet Information Server (IIS) und O'Reillys WebSite Pro verwendet werden kann . Plugin. Das Verhalten dauerhafter Verbindungen entspricht im Wesentlichen dem zuvor beschriebenen Multiprozessmodell. Beachten Sie, dass PHP 3 SAPI nicht unterstützt.

Wenn eine dauerhafte Verbindung keine zusätzlichen Funktionen bietet, welche Vorteile bietet ihre Verwendung?

Die Antwort ist ganz einfach: Effizienz. Dauerhafte Verbindungen sind effizienter, wenn Clientanfragen für Verbindungen zum SQL-Server sehr häufig sind. Die Kriterien für häufige Verbindungsanfragen hängen von vielen Faktoren ab. Zum Beispiel die Art der Datenbank, ob sich der Datenbankdienst und der Webdienst auf demselben Server befinden, wie der SQL-Server die Last lädt usw. Aber wir wissen zumindest, dass bei häufigen Verbindungsanfragen dauerhafte Verbindungen die Effizienz erheblich verbessern. Dadurch kann jeder untergeordnete Prozess während seines Lebenszyklus nur einen Verbindungsvorgang ausführen, anstatt bei jeder Verarbeitung einer Seite eine Verbindungsanforderung an den SQL-Server zu stellen. Dies bedeutet, dass jeder untergeordnete Prozess seine eigene unabhängige dauerhafte Verbindung zum Server aufbaut. Wenn beispielsweise 20 verschiedene untergeordnete Prozesse ein Skript ausführen, das eine permanente Verbindung zu einem SQL-Server herstellt, werden tatsächlich 20 verschiedene permanente Verbindungen zum SQL-Server hergestellt, eine für jeden Prozess.

Beachten Sie, dass das System einige Fehler verursacht, wenn die Anzahl der dauerhaft verbundenen untergeordneten Prozesse das festgelegte Datenbankverbindungslimit überschreitet. Wenn die Datenbank ein Limit von 16 gleichzeitigen Verbindungen hat und im Falle einer ausgelasteten Sitzung 17 Threads versuchen, eine Verbindung herzustellen, kann ein Thread keine Verbindung herstellen. Wenn zu diesem Zeitpunkt ein Fehler im Skript auftritt, der das Schließen der Verbindung verhindert (z. B. eine Endlosschleife), sind die 16 Verbindungen zur Datenbank schnell betroffen. Informationen zum Umgang mit abgebrochenen und inaktiven Verbindungen finden Sie in der Dokumentation zur Verwendung Ihrer Datenbank.

Bei der Verwendung dauerhafter Verbindungen sind einige Besonderheiten zu beachten. Wenn Sie beispielsweise eine Tabellensperre in einer permanenten Verbindung verwenden und das Skript die Tabellensperre aus irgendeinem Grund nicht aufheben kann, werden nachfolgende Skripte, die dieselbe Verbindung verwenden, dauerhaft blockiert, sodass der httpd-Dienst oder der Datenbankdienst neu gestartet werden muss. Wenn bei Verwendung der Transaktionsverarbeitung das Skript außerdem vor der Transaktionsblockierung endet, wirkt sich die Blockierung auch auf das nächste Skript aus, das dieselbe Verbindung verwendet. Unabhängig von der Situation können Sie eine einfache Bereinigungsfunktion registrieren, um die Datentabellensperre zu öffnen oder die Transaktion mithilfe der Funktion register_shutdown_function() rückgängig zu machen. Oder eine bessere Möglichkeit besteht darin, in Skripten, die Datentabellensperren oder Transaktionsverarbeitung verwenden, keine permanenten Verbindungen zu verwenden, was dieses Problem grundsätzlich lösen kann (natürlich können Sie auch an anderen Stellen permanente Verbindungen verwenden).

Das Folgende ist eine wichtige Zusammenfassung. Permanente Verbindungen dienen dazu, eine Eins-zu-Eins-Verteilung für gemeinsame Verbindungen herzustellen. Das bedeutet, dass Sie garantieren können müssen, dass sich das Verhalten des Skripts nicht ändert, wenn eine persistente Verbindung durch eine nicht persistente Verbindung ersetzt wird. Die Verwendung einer dauerhaften Verbindung wird (sehr) wahrscheinlich die Effizienz des Skripts ändern, nicht jedoch sein Verhalten!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn