# Die Erweiterung mysqli und persistente (beständige) Verbindungen

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.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open