Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

As instruções preparadas são armazenadas em cache no lado do servidor em várias cargas de página com PHP?


Quando uma solicitação é atendida, o php "limpa" a instância e libera recursos e outras variáveis. Isso é feito em várias etapas. Como o fastcgi mantém o processo ativo após uma solicitação, nem todas as etapas são executadas e nem toda a memória é liberada. Existe e.g. EG(persistent_list) que é usado por mysql_pconnect() , pg_pconnect() , ... Esta lista não é esvaziada entre as solicitações enquanto o processo se mantiver ativo (pode ser, dependendo da implementação real, mas isso desafiaria o propósito de EG(persistent_list)). Se você usar conexões persistentes, seu script pode obter uma conexão "reutilizada" estabelecida durante uma solicitação anterior.
Para (re-)usar uma instrução preparada diretamente, você precisa do identificador dessa instrução (e dessa conexão). Ao usar (php-)postgresql isso é simplesmente uma string única (em relação à conexão) que você passa para pg_execute() , para que seu script não tenha problemas para acessar a instrução previamente preparada por outra instância (usando a mesma conexão).
Usando mysqli ou PDO-mysql você precisa de um recurso/objeto como identificador de instrução. Isso é um problema, pois nem a extensão mysqli nem a extensão pdo parecem oferecer uma maneira de armazenar o recurso em EG(persist_list) entre solicitações e você também não pode recriá-lo. A menos que o php-fpm ofereça tal "serviço", parece impossível reutilizar diretamente uma instrução preparada pelo mysql.
Tudo o que você pode esperar é o cache de consulta do lado do servidor . Em versões recentes (ver link) pode reconhecer a declaração ao usar declarações preparadas. Mas mesmo assim ele não reutiliza a declaração preparada real:

Portanto, se não me engano, atualmente você não pode reutilizar uma instrução mysql preparada durante uma solicitação anterior em php.