Nach langem Suchen habe ich endlich eine Lösung gefunden.
Ich bin kein großer Schriftsteller, deshalb werde ich mein Bestes geben, um dies so kurz wie möglich zu halten.
Soweit ich das beurteilen konnte, gibt es zwei mögliche Lösungen:
SQL-Relay
http://sqlrelay.sourceforge.net/
Dies macht genau das, was die Frage verlangt, und ein paar mehr. Ich werde nicht zu sehr ins Detail gehen, was ich darüber herausfinden konnte, aber ich werde erwähnen, dass es keine praktikable Lösung war, da es nicht transparent ist. Dies bedeutet, dass der Fluss wie folgt ist:
PHP -> Queries -> SQL Relay Extension -> SQL Relay -> Externally hosted MySQL
Das hätte also dazu geführt, dass wir unseren gesamten Code von MySQL auf SQL Relay umgeschrieben hätten. In unserem Fall keine Option.
Wenn jedoch jemand ein neues Großprojekt plant, das eine der zahlreichen Funktionen von SQL Relay erfordert, klingt dies sehr schön.
Mysql Proxy
http://forge.mysql.com/wiki/MySQL_Proxy
Dies ist die Lösung, die wir letztendlich verwendet haben.
Der Schlüssel dazu ist das Pooling-LUA-Skript für den MySQL-Proxy.
Diese LUA-Erweiterung finden Sie unter:
https://github.com/cwarden/mysql-proxy/blob/315ab806bb95b8223f5afd3d238eff2a40af03d8/lib/ro-pooling.lua
Hier sind einige grundlegende Statistiken, ohne auf allzu viele Details einzugehen.
[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
6433 38598 572537
Nachdem Sie zu mysql-proxy gewechselt und die Dinge regeln lassen haben:
[root@HOSTNAME etc]# netstat -na | grep ":3306 " | grep TIME_WAIT | wc
32 192 2848
Wie Sie deutlich sehen können, sind die TIME_WAIT-Ports für mysql auf fast keinen gesunken.
Die Verbindungen bleiben nun tatsächlich OHNE mysql_pconnect / mysqli_connect (... p: hostname ...) bestehen.
Erwähnenswert sind anscheinend einige konfigurierbare Einstellungen oben im pooler lua-Skript.
lokale min_idle_connections
und
lokale max_idle_connections
Diese scheinen ziemlich selbsterklärend zu sein. Ausgenommen das: Es scheint, dass jede Kombination aus Benutzername (und Passwort? Ungetestet ... höchstwahrscheinlich nicht.) Einen eigenen Satz persistenter Verbindungen erzeugt.
Multiplizieren Sie also max_idle_connections mit der Anzahl der eindeutigen MySQL-Benutzer, die eine Verbindung zur Datenbank herstellen. Und das sollte Ihnen eine Vorstellung davon geben, wie viele freie Verbindungen Sie am Ende haben werden.
Lassen Sie mich noch einmal wiederholen, damit dieser kleine Klappentext einige Keywords für Suchende über Google enthält:
Ist es bei Verwendung von PHP möglich, dauerhafte MySQL-Verbindungen OHNE MySQL_Pconnect zu haben?
Ja, dies kann über SQL Relay erfolgen, wenn es Ihnen nichts ausmacht, den größten Teil Ihres Codes neu zu erstellen, um Ihre Abfragen durch ihre Erweiterung zu leiten, ODER wenn Sie mysql-proxy mit dem Skript ro-pooling.lua transparent verwenden.
So etwas wollen wir schon seit einem Jahr.
GENIESSEN!
mysql_pconnect
jede Verbindung mit einigen "Bereinigungsfunktionen" verwenden und starten?Persistent Connection Support wurde in PHP 5.3 für die
mysqli
Erweiterung eingeführt. Unterstützung gab es bereits in PDO MYSQL und ext / mysql. Die Idee hinter dauerhaften Verbindungen ist, dass eine Verbindung zwischen einem Client-Prozess und einer Datenbank von einem Client-Prozess wiederverwendet werden kann, anstatt mehrmals erstellt und zerstört zu werden. Dies reduziert den Aufwand für das Erstellen neuer Verbindungen bei jeder Anforderung, da nicht verwendete Verbindungen zwischengespeichert werden und zur Wiederverwendung bereit sind.Bietet im Gegensatz zur mysql-Erweiterung
mysqli
keine separate Funktion zum Öffnen dauerhafter Verbindungen. Um eine dauerhafte Verbindung herzustellen, müssen Sie beim Herstellen der Verbindung dem Hostnamen p: voranstellen.Die dauerhafte Verbindung der mysqli-Erweiterung bietet jedoch integrierten Code für die Bereinigungsbehandlung. Die von mysqli durchgeführte Bereinigung beinhaltet:
Dadurch wird sichergestellt, dass persistente Verbindungen bei der Rückkehr aus dem Verbindungspool in einem sauberen Zustand sind, bevor der Clientprozess sie verwendet.
Die mysqli-Erweiterung führt diese Bereinigung durch, indem sie automatisch die C-API-Funktion aufruft
mysql_change_user()
.Die automatische Bereinigung bietet jedoch Vor- und Nachteile. Der Vorteil ist, dass sich der Programmierer nicht mehr um das Hinzufügen von Bereinigungscode kümmern muss, da dieser automatisch aufgerufen wird. Der Nachteil ist jedoch, dass der Code möglicherweise etwas langsamer ist, da der Code zum Ausführen der Bereinigung jedes Mal ausgeführt werden muss, wenn eine Verbindung aus dem Verbindungspool zurückgegeben wird.
Es ist möglich, den automatischen Bereinigungscode auszuschalten, indem PHP mit
MYSQLI_NO_CHANGE_USER_ON_PCONNECT
defined kompiliert wird .Hinweis:
Die mysqli-Erweiterung unterstützt dauerhafte Verbindungen, wenn Sie entweder MySQL Native Driver oder MySQL Client Library verwenden.
Sie können auch auf diese Links verweisen: http://www.mysqlperformanceblog.com/2006/11/12/are-php-persistent-connections-evil/
quelle