2008-09-02 6 views
60

Kann man Datenbankverbindungen zwischenspeichern, wenn man PHP wie in einem J2EE-Container verwendet? Wenn das so ist, wie?Verbindungspooling in PHP

+0

Wie wäre es damit? https://github.com/junamai2000/mod_namy_pool – nam

+0

Haben Sie sich persistente Verbindungen mit [mysql_pconnect()] (http://www.php.net/mysql_pconnect) angesehen? –

Antwort

0

Sie können Verbindungspools nicht manuell instanziieren.

Aber Sie können das "eingebaute" Verbindungspooling mit der mysql_pconnect Funktion verwenden.

8

Ich nehme an, Sie verwenden mod_php, richtig?

Wenn eine PHP-Datei fertig ist, wird der gesamte Zustand beendet, so dass es keine Möglichkeit gibt (im PHP-Code), Verbindungspooling durchzuführen. Stattdessen müssen Sie sich auf Erweiterungen verlassen.

Sie können mysql_pconnect, so dass Ihre Verbindungen nicht nach dem Ende der Seite geschlossen werden, so dass sie in der nächsten Anfrage wiederverwendet werden.

Dies ist möglicherweise alles, was Sie benötigen, aber dies ist nicht das gleiche wie Verbindungspooling, da es keine Möglichkeit gibt, die Anzahl der Verbindungen anzugeben, die geöffnet werden sollen.

Prost.

+3

Kann die Verbindung von verschiedenen Benutzern wiederverwendet werden? Wenn ja, warum sollte das Handbuch so konfiguriert werden, dass wir MySQL so konfigurieren, dass zu viele Verbindungen vermieden werden? – omg

43

Es gibt keine Verbindung Pooling in PHP.
mysql_pconnect und Verbindung Pooling sind zwei verschiedene Dinge. Es gibt viele Probleme im Zusammenhang mit mysql_pconnect und zuerst sollten Sie das Handbuch lesen und sorgfältig verwenden, aber dies ist nicht 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, wenn es eine freie Verbindung gibt. gehen Sie bitte über folgenden Link

Wir können für diese Verbindung Skalierung in PHP tun: http://www.oracle.com/technetwork/articles/dsl/white-php-part1-355135.html

Also keine Connection-Pooling in PHP.

Wie Julio sagte, Apache gibt alle Ressourcen frei, wenn die Anfrage für die aktuellen Anfragen endet. Sie können mysql_pconnect verwenden, aber Sie sind mit dieser Funktion eingeschränkt und Sie müssen sehr vorsichtig sein. Eine andere Möglichkeit besteht darin, ein Singleton-Muster zu verwenden, aber nichts davon ist ein Pooling.

Dies ist ein guter Artikel: http://blogs.oracle.com/opal/2007/01/highly_scalable_connection_poo.html

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

+7

Kein Verbindungsaufbau? Beeindruckend. – Justin

+0

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

+2

Arbeitslink für das Orakel-Blog: https://blogs.oracle.com/opal/entry/highly_scalable_connection_poo –

10

Persistente Verbindungen sind nichts wie Connection Pooling. Eine persistente Verbindung in PHP wird nur dann wiederverwendet, wenn Sie mehrere db-Verbindungen innerhalb desselben Anfrage-/Skriptausführungskontexts herstellen. In den meisten typischen Web-Dev-Szenarios werden Sie Ihre Verbindungen viel schneller maximieren, wenn Sie mysql_pconnect verwenden, da Ihr Skript keine Möglichkeit hat, bei Ihrer nächsten Anfrage 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, so dass die Verbindung im Kontext der Skriptausführung wiederverwendet wird. Dies erfordert immer noch mindestens 1 db connect pro Anfrage, aber es ist besser als mehrere db connects per reqeust.

Es gibt kein echtes DB Verbindungspooling in PHP aufgrund der Natur von PHP.PHP ist kein Anwendungsserver, der zwischen Requests Platz nehmen und Referenzen auf einen Pool offener Verbindungen verwalten kann, zumindest nicht ohne einen großen Hack. Ich denke in der Theorie könnten Sie einen app-Server in PHP schreiben und es als ein Befehlszeilenskript ausführen, das nur dort im Hintergrund sitzen würde und eine Reihe von db-Verbindungen offen halten und Verweise auf sie an Ihre anderen Skripte weitergeben würde, aber ich tue es nicht Wissen Sie, ob das in der Praxis möglich wäre, wie Sie die Referenzen von Ihrem Kommandozeilenskript an andere Skripte weitergeben würden, und ich bezweifle, dass es auch dann gut abschneidet, wenn Sie es schaffen könnten. Jedenfalls ist das meistens Spekulation. Ich habe gerade den Link bemerkt, den ein anderer Benutzer an ein Apache-Modul gesendet hat, um das Verbindungs-Pooling für Prefork-Server wie php zu ermöglichen. Sieht interessant aus: https://github.com/junamai2000/mod_namy_pool#readme

+3

"Die Verbindung zu Der SQL-Server wird nicht geschlossen, wenn die Ausführung des Skripts beendet ist. " - http://www.php.net/manual/en/function.mysql-pconnect.php – RandomSeed

+2

Dies ist falsch auf PHP-FPM und Apache/mod_php. –

+0

"Der beste Weg, DB-Verbindungen in PHP zu verwenden, besteht darin, eine Singleton-Instanz eines db-Objekts zu erstellen, so dass die Verbindung im Kontext der Skriptausführung wiederverwendet wird." - Das ist die goldene Gans, nach der ich suche. Gute Möglichkeit, genau zu erklären, wo und warum das Singleton nützlich wäre! – samazi

Verwandte Themen