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

Werden vorbereitete Anweisungen serverseitig über mehrere Seitenladevorgänge mit PHP zwischengespeichert?

Wenn eine Anfrage bedient wird, "reinigt" PHP die Instanz und gibt Ressourcen und andere Variablen frei. Dies geschieht in mehreren Schritten. Da fastcgi den Prozess nach einer Anfrage am Leben erhält, werden nicht alle Schritte ausgeführt und nicht der gesamte Speicher freigegeben. Es gibt z. EG(persistent_list), die von mysql_pconnect() verwendet wird , pg_pconnect() , ... Diese Liste wird zwischen Anfragen nicht geleert, solange der Prozess am Leben bleibt (kann abhängig von der tatsächlichen Implementierung sein, aber das würde dem Zweck von EG(persistent_list) widersprechen). Wenn Sie dauerhafte Verbindungen verwenden, erhält Ihr Skript möglicherweise eine "wiederverwendete" Verbindung, die während einer früheren Anfrage hergestellt wurde.
Um eine vorbereitete Anweisung direkt (wieder-)zuverwenden, benötigen Sie den Bezeichner für diese Anweisung (und diese Verbindung). Bei Verwendung von (php-)postgresql ist dies einfach ein (verbindungsmäßig) eindeutiger String, den Sie an pg_execute()<übergeben /a> , sodass Ihr Skript problemlos Zugriff auf die zuvor von einer anderen Instanz erstellte Anweisung (unter Verwendung derselben Verbindung) erhält.
Mit
mysqli oder PDO-mysql Sie benötigen eine Ressource/ein Objekt als Anweisungsbezeichner. Das ist ein Problem, da weder mysqli noch die pdo-Erweiterung eine Möglichkeit zu bieten scheinen, die Ressource zwischen Anfragen in EG(persist_list) zu speichern, und Sie können sie auch nicht neu erstellen. Wenn php-fpm keinen solchen „Dienst“ anbietet, scheint es unmöglich, eine von MySQL vorbereitete Anweisung direkt wiederzuverwenden.
Alles, worauf Sie hoffen können, ist MySQLs serverseitiger Abfrage-Cache . In neueren Versionen (siehe Link) erkennt es die Anweisung möglicherweise, wenn vorbereitete Anweisungen verwendet werden. Aber selbst dann wird die eigentliche vorbereitete Anweisung nicht wiederverwendet:

Also, wenn ich mich nicht irre, können Sie derzeit keine MySQL-Anweisung wiederverwenden, die während einer früheren Anfrage in PHP erstellt wurde.