Die Idee hinter persistenten Verbindungen ist, dass eine Verbindung zwischen einem Client-Prozess und einer Datenbank von einem Client-Prozess mehrfach verwendet werden kann, anstatt jedes Mal neu erstellt und zerstört zu werden. Da ungenutzte Verbindungen zwischengespeichert werden und zur Wiederverwendung bereitstehen, reduziert sich der Mehraufwand, der entsteht, wenn jedes Mal eine neue Verbindung erstellt werden muss.
Im Gegensatz zur Erweiterung mysql bietet mysqli keine eigene Funktion zum
Öffnen von persistenten Verbindungen. Um eine persistente Verbindung zu
öffnen, muss dem Hostnamen beim Aufbau der Verbindung das Präfix
p:
vorangestellt werden.
Das Problem bei persistenten Verbindungen ist, dass sie von Clients in
unvorhersehbaren Zuständen hinterlassen werden können. Zum Beispiel könnte
eine Tabellensperre aktiviert werden, bevor ein Client unerwartet beendet
wird. Ein neuer Client-Prozess, der diese persistente Verbindung
wiederverwendet, erhält die Verbindung as is
(so wie sie
ist). Der neue Client-Prozess müsste alle notwendigen Aufräumarbeiten
durchführen, bevor er die persistente Verbindung sinnvoll nutzen kann, was
den Aufwand für den Programmierer erhöht.
Für diese Aufräumarbeiten ist in der persistenten Verbindung der
Erweiterung mysqli
jedoch ein entsprechender Code
enthalten. Die Aufräumarbeiten, die von mysqli
durchgeführt werden, umfassen:
das Rollback aktiver Transaktionen
das Schließen und Löschen temporärer Tabellen
das Entsperren von Tabellen
das Zurücksetzen von Sessionvariablen
das Schließen vorbereiteter Anweisungen (geschieht bei PHP immer)
das Schließen von Handlern
die Freigabe von Sperren, die mit GET_LOCK() gesetzt wurden
Dadurch wird sichergestellt, dass sich eine persistente Verbindungen in einem bereinigten Zustand befindet, wenn sie aus dem Verbindungs-Pool abgerufen wird, bevor der Client-Prozess sie verwendet.
Die Erweiterung mysqli
erledigt diese Bereinigung durch
den automatischen Aufruf der C-API-Funktion
mysql_change_user()
.
Die automatisierte Bereinigung hat jedoch Vor- und Nachteile. Der Vorteil ist, dass der Programmierer sich nicht mehr darum kümmern muss, den Bereinigungscode hinzuzufügen, da er automatisch aufgerufen wird. Der Nachteil ist jedoch, dass der Code eventuell etwas langsamer sein könnte, da er zur Durchführung der Bereinigung jedes Mal ausgeführt werden muss, wenn eine Verbindung aus dem Verbindungs-Pool abgerufen wird.
Der Code für die automatische Bereinigung kann abgeschaltet werden, indem
PHP mit der Option MYSQLI_NO_CHANGE_USER_ON_PCONNECT
kompiliert wird.
Hinweis:
Die Erweiterung
mysqli
unterstützt persistente Verbindungen, wenn sie entweder den MySQL Native Driver oder die MySQL Client Library verwendet.