sql >> Base de Datos >  >> RDS >> Mysql

¿Las declaraciones preparadas se almacenan en caché en el lado del servidor a través de múltiples cargas de página con PHP?

Cuando se atiende una solicitud, php "limpia" la instancia y libera recursos y otras variables. Esto se hace en varios pasos. Dado que fastcgi mantiene vivo el proceso después de una solicitud, no se ejecutan todos los pasos y no se libera toda la memoria. Hay por ej. EG (persistent_list) que es utilizado por mysql_pconnect() , pg_pconnect() , ... Esta lista no se vacía entre solicitudes siempre que el proceso se mantenga vivo (podría ser, dependiendo de la implementación real, pero eso desafiaría el propósito de EG (persistent_list)). Si usa conexiones persistentes, su secuencia de comandos podría obtener una conexión "reutilizada" establecida durante una solicitud anterior.
Para (re)utilizar una declaración preparada directamente, necesita el identificador para esa declaración (y esa conexión). Al usar (php-)postgresql, esta es simplemente una cadena única (en cuanto a la conexión) que pasa a pg_execute() , por lo que su secuencia de comandos no tiene problema para obtener acceso a la declaración preparada previamente por otra instancia (usando la misma conexión).
Usando mysqli o PDO-mysql necesita un recurso/objeto como identificador de declaración. Eso es un problema, ya que ni mysqli ni la extensión pdo parecen ofrecer una forma de almacenar el recurso en EG (persist_list) entre solicitudes y tampoco puede volver a crearlo. A menos que php-fpm ofrezca un "servicio" de este tipo, parece imposible reutilizar directamente una declaración preparada de mysql.
Todo lo que puede esperar es caché de consultas del lado del servidor . En versiones recientes (ver enlace) es posible que reconozca la declaración al usar declaraciones preparadas. Pero incluso entonces no reutiliza la declaración preparada real:

Entonces, si no me equivoco, actualmente no puede reutilizar una declaración mysql preparada durante una solicitud anterior en php.