Ist es möglich, Datenbankverbindungen zwischenzuspeichern, wenn Sie PHP wie in einem J2EE-Container verwenden? Wenn das so ist, wie?
php
connection-pooling
Der Vorsitzende
quelle
quelle
Antworten:
Es gibt kein Verbindungspooling in PHP.
mysql_pconnect und Verbindungspooling sind zwei verschiedene Dinge. Es gibt viele Probleme, die damit verbunden sind,
mysql_pconnect
und 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
quelle
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
quelle
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.
quelle
Sie können MySQLi verwenden .
Für weitere Informationen, gehen Sie zu unten Verbindungspooling Abschnitt @ http://www.php.net/manual/en/mysqli.quickstart.connections.php#example-1622
Beachten Sie, dass das Verbindungspooling auch von Ihrem Server (dh Apache httpd) und seiner Konfiguration abhängt.
quelle
Das Verbindungspooling funktioniert auf der MySQL-Serverseite wie folgt.
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.
quelle
Sie können Verbindungspools nicht manuell instanziieren.
Sie können jedoch das "integrierte" Verbindungspooling mit der Funktion mysql_pconnect verwenden.
quelle
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.
quelle
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.
quelle