Mysql
 sql >> Database >  >> RDS >> Mysql

Le istruzioni preparate vengono memorizzate nella cache lato server su più caricamenti di pagina con PHP?

Quando viene servita una richiesta, php "pulisce" l'istanza e libera risorse e altre variabili. Questo viene fatto in diversi passaggi. Poiché fastcgi mantiene vivo il processo dopo una richiesta, non tutti i passaggi vengono eseguiti e non tutta la memoria viene liberata. C'è ad es. EG(persistent_list) utilizzato da mysql_pconnect() , pg_pconnect() , ... Questo elenco non viene svuotato tra le richieste finché il processo rimane attivo (potrebbe essere, a seconda dell'implementazione effettiva, ma ciò sfiderebbe lo scopo di EG(persistent_list)). Se utilizzi connessioni persistenti, il tuo script potrebbe ottenere una connessione "riutilizzata" stabilita durante una richiesta precedente.
Per (ri)utilizzare direttamente un'istruzione preparata è necessario l'identificatore di tale istruzione (e quella connessione). Quando si utilizza (php-)postgresql, questa è semplicemente una stringa univoca (a livello di connessione) che si passa a pg_execute() , quindi il tuo script non ha problemi ad accedere all'istruzione precedentemente preparata da un'altra istanza (utilizzando la stessa connessione).
Utilizzando mysqli o PDO-mysql hai bisogno di una risorsa/oggetto come identificatore di istruzione. È una specie di problema poiché né l'estensione mysqli né pdo sembrano offrire un modo per archiviare la risorsa in EG (persist_list) tra le richieste e non puoi nemmeno ricrearla. A meno che php-fpm non offra un tale "servizio", sembra impossibile riutilizzare direttamente un'istruzione preparata da MySQL.
Tutto ciò che puoi sperare è cache delle query lato server . Nelle versioni recenti (vedi link) può riconoscere l'istruzione quando utilizza dichiarazioni preparate. Ma anche in questo caso non riutilizza l'effettiva istruzione preparata:

Quindi, se non sbaglio, al momento non è possibile riutilizzare un'istruzione mysql preparata durante una precedente richiesta in php.