Verbindungspooling in PHP


Antworten:


57

Es gibt kein Verbindungspooling in PHP.
mysql_pconnect und Verbindungspooling sind zwei verschiedene Dinge. Es gibt viele Probleme, die damit verbunden sind, mysql_pconnectund zuerst sollten Sie das Handbuch lesen und sorgfältig verwenden, aber dies ist kein Verbindungspooling.

Verbindungspooling ist eine Technik, bei der der Anwendungsserver die Verbindungen verwaltet. Wenn die Anwendung eine Verbindung benötigt, fragt sie den Anwendungsserver danach und der Anwendungsserver gibt eine der gepoolten Verbindungen zurück, falls eine frei ist.

Wir können die Verbindungsskalierung in PHP durchführen. Gehen Sie dazu über den folgenden Link: http://www.oracle.com/technetwork/articles/dsl/white-php-part1-355135.html

Also kein Verbindungspooling in PHP.

Wie Julio sagte, gibt Apache alle Ressourcen frei, wenn die Anforderung für die aktuellen Anforderungen endet. Sie können mysql_pconnect verwenden, aber Sie sind mit dieser Funktion eingeschränkt und müssen sehr vorsichtig sein. Eine andere Möglichkeit ist die Verwendung eines Singleton-Musters, aber nichts davon ist Pooling.

Dies ist ein guter Artikel: https://blogs.oracle.com/opal/highly-scalable-connection-pooling-in-php

Lesen Sie auch diese http://www.apache2.es/2.2.2/mod/mod_dbd.html


16
Kein Verbindungspooling? Beeindruckend.
Justin

2
"Die Verbindung zum SQL Server wird nicht geschlossen, wenn die Ausführung des Skripts endet." - php.net/manual/en/function.mysql-pconnect.php
RandomSeed


15

Permanente Verbindungen sind nichts anderes als Verbindungspooling. Eine dauerhafte Verbindung in PHP wird nur wiederverwendet, wenn Sie mehrere Datenbankverbindungen innerhalb desselben Kontextes für die Anforderung / Skriptausführung herstellen. In den meisten typischen Webentwicklungsszenarien können Sie Ihre Verbindungen viel schneller maximieren, wenn Sie mysql_pconnect verwenden, da Ihr Skript bei Ihrer nächsten Anforderung keine Möglichkeit hat, einen Verweis auf offene Verbindungen zu erhalten. Die beste Möglichkeit, DB-Verbindungen in PHP zu verwenden, besteht darin, eine Singleton-Instanz eines DB-Objekts zu erstellen, damit die Verbindung im Kontext Ihrer Skriptausführung wiederverwendet wird. Dies erfordert immer noch mindestens 1 DB-Verbindung pro Anforderung, aber es ist besser, als mehrere DB-Verbindungen pro Anforderung herzustellen.

Aufgrund der Natur von PHP gibt es in PHP kein echtes DB-Verbindungspooling. PHP ist kein Anwendungsserver, der zwischen Anforderungen sitzen und Verweise auf einen Pool offener Verbindungen verwalten kann, zumindest nicht ohne einen größeren Hack. Ich denke, theoretisch könnten Sie einen App-Server in PHP schreiben und ihn als Befehlszeilenskript ausführen, das nur im Hintergrund steht und eine Reihe von Datenbankverbindungen offen hält und Verweise auf diese an Ihre anderen Skripte weitergibt, aber ich nicht Sie wissen, ob dies in der Praxis möglich wäre, wie Sie die Referenzen aus Ihrem Befehlszeilenskript an andere Skripte weitergeben würden, und ich bezweifle, dass dies auch dann gut funktioniert, wenn Sie es schaffen könnten. Jedenfalls handelt es sich hauptsächlich um Spekulationen. Ich habe gerade den Link bemerkt, den jemand anderes auf ein Apache-Modul gepostet hat, um das Verbindungspooling für Prefork-Server wie PHP zu ermöglichen. https://github.com/junamai2000/mod_namy_pool#readme


3
"Die Verbindung zum SQL Server wird nicht geschlossen, wenn die Ausführung des Skripts endet." - php.net/manual/en/function.mysql-pconnect.php
RandomSeed

"Der beste Weg, DB-Verbindungen in PHP zu verwenden, besteht darin, eine Singleton-Instanz eines DB-Objekts zu erstellen, damit die Verbindung im Kontext Ihrer Skriptausführung wiederverwendet wird." - Dies ist die goldene Gans, die ich suche. Tolle Möglichkeit, genau zu erklären, wo und warum der Singleton nützlich wäre!
Samazi

9

Ich nehme an, Sie verwenden mod_php, richtig?

Wenn eine PHP-Datei die Ausführung beendet hat, wird ihr gesamter Status gelöscht, sodass (im PHP-Code) keine Möglichkeit zum Verbindungspooling besteht. Stattdessen müssen Sie sich auf Erweiterungen verlassen.

Sie können mysql_pconnect verwenden, damit Ihre Verbindungen nach Abschluss der Seite nicht geschlossen werden. Auf diese Weise werden sie bei der nächsten Anforderung wiederverwendet.

Dies ist möglicherweise alles, was Sie benötigen, entspricht jedoch nicht dem Verbindungspooling, da die Anzahl der Verbindungen, die geöffnet bleiben sollen, nicht angegeben werden kann.


3
Kann die Verbindung von verschiedenen Benutzern wiederverwendet werden? Wenn ja, warum heißt es im Handbuch, dass wir MySQL konfigurieren sollten, um zu viele Verbindungen zu vermeiden?
Omg


1

Das Verbindungspooling funktioniert auf der MySQL-Serverseite wie folgt.

  1. Wenn die Persistenzverbindung in der MySQL-Serverkonfiguration aktiviert ist, hält MySQL eine Verbindung offen und im Ruhezustand, nachdem der angeforderte Client (PHP-Skript) seine Arbeit beendet hat und stirbt.
  2. Wenn eine zweite Anforderung dieselben Anmeldeinformationsdaten enthält (gleicher Benutzername, gleiches Kennwort, gleicher Verbindungsparameter, gleicher Datenbankname, möglicherweise von derselben IP, ich bin mir nicht sicher über die IP), bündelt MySQL die vorherige Verbindung vom Ruhezustand in den aktiven Zustand und lassen Sie den Client die Verbindung verwenden. Dies hilft MySQL, Zeit für die anfängliche Ressource für die Verbindung zu sparen und die Gesamtzahl der Verbindungen zu reduzieren.

Die Option zum Verbindungspooling ist also tatsächlich auf der MySQL-Serverseite verfügbar. Am Ende des PHP-Codes gibt es keine Option. mysql_pconnect () ist nur ein Wrapper, der PHP anweist, am Ende des Skriptlaufs kein Anforderungssignal zum Schließen der Verbindung zu senden.


0

Sie können Verbindungspools nicht manuell instanziieren.

Sie können jedoch das "integrierte" Verbindungspooling mit der Funktion mysql_pconnect verwenden.


0

Ich würde gerne vorschlagen PDO::ATTR_PERSISTENT

Permanente Verbindungen sind Links, die nicht geschlossen werden, wenn die Ausführung Ihres Skripts endet. Wenn eine dauerhafte Verbindung angefordert wird, prüft PHP, ob bereits eine identische dauerhafte Verbindung besteht (die von früher offen geblieben ist) - und verwendet sie, falls vorhanden. Wenn es nicht existiert, wird der Link erstellt.


0

Wenn eine nicht verwendete dauerhafte Verbindung für eine bestimmte Kombination aus "Host, Benutzername, Kennwort, Socket, Port und Standarddatenbank nicht gefunden werden kann" im offenen Verbindungspool gefunden wird, öffnet nur mysqli eine neue Verbindung, andernfalls würde es bereits geöffnete verfügbare dauerhafte Verbindungen wiederverwenden Dies ähnelt in ähnlicher Weise dem Konzept des Verbindungspoolings. Die Verwendung dauerhafter Verbindungen kann mithilfe der PHP-Direktive mysqli.allow_persistent aktiviert und deaktiviert werden. Die Gesamtzahl der von einem Skript geöffneten Verbindungen kann mit mysqli.max_links begrenzt werden (dies kann für Sie interessant sein, um das Problem mit max_user_connections zu beheben, das das Limit des Hosting-Servers erreicht). Die maximale Anzahl persistenter Verbindungen pro PHP-Prozess kann mit mysqli.max_persistent eingeschränkt werden.

Im weiteren Programmierkontext ist es eine Aufgabe des Web- / App-Servers. In diesem Kontext wird es jedoch von der mysqli-Direktive von PHP selbst so behandelt, dass die Wiederverwendbarkeit von Verbindungen unterstützt wird. Sie können auch eine Singleton-Klasse implementieren, um eine statische Verbindungsinstanz wie in Java wiederzuverwenden. Ich möchte nur daran erinnern, dass Java das Verbindungspooling als Teil seines Standard-JDBC nicht unterstützt, da es sich um verschiedene Module / Ebenen handelt, die über JDBC-Treibern liegen.

In Bezug auf PHP ist das Gute, dass für die allgemeinen Datenbanken im PHP-Echosystem persistente Datenbankverbindungen unterstützt werden, die die Verbindung für 500 Anforderungen beibehalten (Konfiguration von max_requests in php.ini), wodurch vermieden wird, dass bei jeder Anforderung eine neue Verbindung erstellt wird. Schauen Sie sich das in den Dokumenten im Detail an, es löst die meisten Ihrer Herausforderungen. Bitte beachten Sie, dass PHP im Vergleich zu streng objektorientiertem Java in Bezug auf umfangreiche Multithreading-Mechanismen und gleichzeitige Verarbeitung sowie leistungsstarke asynchrone Ereignisbehandlung nicht so ausgefeilt ist. In gewisser Weise ist es für PHP weniger effektiv, über einen solchen eingebauten Mechanismus wie das Pooling zu verfügen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.