## Architecture et conceptes

Le plugin de mise en cache de requêtes est implémenté comme une extension PHP. Il est écrit en C et opère en dessous de PHP. Lors du démarrage de l'interpréteur PHP, il est enregistré comme un plugin mysqlnd pour remplacer les méthodes sélectionnées de mysqlnd C. Ainsi, il peut modifier le comportement de n'importe quelle extension PHP MySQL (mysqli, PDO_MYSQL, mysql) compilée pour utiliser la bibliothèque mysqlnd sans modification de l'API de l'extension. Ceci rend le plugin compatible avec toutes les applications PHP MySQL. En raison du fait que l'API n'est pas modifiée, son utilisation est totalement transparente. Reportez-vous à la description de l'API plugin de mysqlnd pour plus de détails sur les avantages de l'architecture plugin et une comparaison avec les solutions basées sur les proxy.

Utilisation transparente

Lors de l'exécution de PHP, PECL/mysqlnd_qc peut réagir comme un proxy pour les requêtes émises depuis PHP (mysqlnd) vers le serveur MySQL. Il inspecte la chaîne de requête pour décider si les résultats doivent être mis en cache ou non. Si c'est le cas, le jeu de résultats est mis en cache en utilisant un gestionnaire de stockage et les futures exécutions de cette requête seront servies depuis le cache pour une période définie par l'utilisateur. La durée de vie, ou TTL de l'entrée du cache peut être soit déterminée de façon globale, soit pour chaque requête.

Une requête est soit mise en cache si il est demandé au plugin de mettre en cache de façon globale toutes les requêtes, soit si la chaîne de requête comme avec une astuce SQL (/*qc=on*/). Le plugin est capable de mettre en cache n'importe quelle requête soumise par un appel approprié de l'API depuis n'importe quelle extension PHP MySQL.

Stockage flexible : divers gestionnaires de stockage

Divers gestionnaires de stockage sont supportés pour offrir différents scopes pour les entrées du cache. Les différents scopes autorisent différents degrés dans le partage des entrées du cache entre les clients.

- default (interne) : processus mémoire, scope : une ou plusieurs requêtes suivant le modèle de déployement de PHP utilisé

- APC : mémoire partagée, scope : un seul serveur, plusieurs requêtes web

- SQLite : en mémoire ou dans un fichier, scope : un seul serveur, plusieurs requêtes web

- MEMCACHE : mémoire principale, scope : un ou plusieurs serveurs, plusieurs requêtes web

- user (interne) : défini par l'utilisateur, scope : défini par l'utilisateur

Le support des gestionnaires de stockage APC, SQLite et MEMCACHE doit être activé lors de la compilation. Le gestionnaire default et user sont internes. Il est possible de passer d'un gestionnaire compilé de stockage à l'autre à chaque requête lors de l'exécution. Cependant, il est recommandé de prendre un gestionnaire de stockage et de l'utiliser pour toutes les entrées du cache.

Défense de type slam interne afin de prévenir une surcharge

Pour prévenir des situations de surcharge, le plugin de mise en cache a un mécanisme de défense de type slam en interne. Si une entrée populaire du cache expire, plusieurs clients utilisant les entrées du cache tenteront de mettre à jour l'entrée du cache. Pendant la durée de se rafraîchissement, plusieurs clients peuvent accéder au serveur de base de données de façon concurrente. Dans la plupart des cas, le serveur de base de données devient surchargé et il prendra de plus en plus de temps à mettre à jour l'entrée du cache, car il recevra de plus en plus de clients qui tenteront de mettre à jour l'entrée du cache. Pour prévenir ce comportement, le plugin a un mécanisme de défense de type slam. Si il est activé et que le plugin détecte l'expiration d'une entrée du cache, il va étendre la durée de vie de cette entrée avant de la mettre à jour. De cette façon, les autres accès concurrents à cette entrée du cache seront toujours servis depuis le cache pour un certain temps. Ainsi, les accès concurrents ne vont pas tous provoquer des mises à jour concurrentes. Idéalement, l'entrée du cache sera mise à jour par le client en étendant sa durée de vie avant que d'autres clients ne tentent de mettre à jour le cache, et potentiellement, éviter ainsi une situation de surcharge.

Approche unique dans la mise en cache

PECL/mysqlnd_qc a une approche unique dans la mise en cache des jeux de résultats qui est supérieure aux solutions de mise en cache des applications. Les solutions applicatives commencent par récupérer un jeu de résultats dans des variables PHP. Puis, les variables PHP sont linéarisées pour stockage dans un cache persistent et délinéarisées lors de la récupération. La mise en cache de requête mysqlnd stocke les données brutes du protocole envoyées depuis MySQl vers PHP dans son cache, et les retournent, si elles sont toujours valides, lors d'une demande d'accès. De cette façon, elle échappe à une étape de linéarisation pour une mise en cache que toutes les solutions applicatives doivent réaliser. Le plugin peut stocker les données brutes du protocole en cache sans avoir à les linéariser en variable PHP dans un premier temps, et de les délinéariser en variable PHP pour le stockage en cache une nouvelle fois.