Mysql
 sql >> Base de données >  >> RDS >> Mysql

Les instructions préparées sont-elles mises en cache côté serveur sur plusieurs chargements de page avec PHP ?

Lorsqu'une requête est servie, php "nettoie" l'instance et libère des ressources et d'autres variables. Cela se fait en plusieurs étapes. Étant donné que fastcgi maintient le processus en vie après une requête, toutes les étapes ne sont pas exécutées et toute la mémoire n'est pas libérée. Il y a par ex. EG(persistent_list) qui est utilisé par mysql_pconnect() , pg_pconnect() , ... Cette liste n'est pas vidée entre les requêtes tant que le processus reste actif (peut-être, selon l'implémentation réelle, mais cela défierait l'objectif de EG(persistent_list)). Si vous utilisez des connexions persistantes, votre script peut obtenir une connexion "réutilisée" établie lors d'une requête précédente.
Pour (ré)utiliser directement une instruction préparée, vous avez besoin de l'identifiant de cette instruction (et de cette connexion). Lorsque vous utilisez (php-)postgresql, il s'agit simplement d'une chaîne unique (au niveau de la connexion) que vous transmettez à pg_execute() , ainsi votre script n'a aucun problème pour accéder à l'instruction préalablement préparée par une autre instance (utilisant la même connexion).
Utilisation mysqli ou PDO-mysql vous avez besoin d'une ressource/objet comme identifiant d'instruction. C'est un peu un problème car ni l'extension mysqli ni l'extension pdo ne semblent offrir un moyen de stocker la ressource dans EG(persist_list) entre les requêtes et vous ne pouvez pas non plus la recréer. À moins que php-fpm n'offre un tel "service", il semble impossible de réutiliser directement une instruction préparée par mysql.
Tout ce que vous pouvez espérer, c'est le cache de requête côté serveur . Dans les versions récentes (voir lien), il peut reconnaître l'instruction lors de l'utilisation d'instructions préparées. Mais même dans ce cas, il ne réutilise pas l'instruction réellement préparée :

Donc, si je ne me trompe pas, actuellement vous ne pouvez pas réutiliser une instruction mysql préparée lors d'une précédente requête en php.