Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Persistenz der PHP-MySQL-Verbindung

Die Persistenz erfolgt durch die Kopie des PHP, das in den Webserver eingebettet ist. Normalerweise hätten Sie recht - wenn PHP im CGI-Modus läuft, wäre es unmöglich, eine dauerhafte Verbindung zu haben, weil nichts mehr bestehen bleiben würde, wenn die Anfrage erledigt ist und PHP herunterfährt.

Da jedoch eine Kopie von PHP in den Webserver eingebettet ist und der Webserver selbst zwischen den Anfragen weiterläuft, ist es möglich, einen Pool von dauerhaften Verbindungen innerhalb dieses "permanenten" PHP aufrechtzuerhalten.

Beachten Sie jedoch, dass bei Apache-Servermodellen vom Typ Multi-Worker die Verbindungspools PRO KIND verwaltet werden. Wenn Sie Ihr Pool-Limit auf 10 festlegen, haben Sie 10 Verbindungen pro Apache-Kind. 20 Kinder =200 Verbindungen.

Dauerhafte Verbindungen führen auch zu langfristigen Problemen mit Deadlocks und anderen schwer zu debuggenden Problemen. Denken Sie daran - es gibt keine Garantie dafür, dass die HTTP-Anforderungen eines Benutzers von der GLEICHEN Apache-Kind-/Mysql-Verbindung bedient werden. Wenn ein Skript während einer Datenbanktransaktion stirbt, wird diese Transaktion NICHT zurückgesetzt werden, weil MySQL die HTTP-Seite der Dinge nicht sieht - alles, was es sieht, ist, dass die mysql<->Apache-Verbindung noch offen ist und davon ausgeht, dass alles in Ordnung ist.

Der nächste Benutzer, der auf diese bestimmte Kombination aus Apache/Mysql-Kind/Verbindung trifft, wird nun auf magische Weise mitten in dieser Transaktion landen, ohne eine Ahnung zu haben, dass die Transaktion offen ist. Im Grunde ist es das Web-Äquivalent einer nicht gespülten Toilette - der gesamte "Müll" des vorherigen Benutzers ist immer noch da.

Bei nicht dauerhaften Verbindungen haben Sie garantiert bei jeder Verbindung eine „saubere“ Umgebung.