Un cache mal structuré peut faire plus de mal que de bien. Dans le pire des cas, un cache peut accroître la charge du serveur de base de données au lieu de la diminuer. Une situation de surcharge peut survenir si un grand nombre d'entrées partagées du cache expirent (débandade du cache).
Les entrées du cache sont partagées et réutilisées à différents degrés suivant le mode de stockage utilisé. Le gestionnaire de stockage par défaut stocke les entrées en mémoire. Ainsi, une entrée du cache peut être réutilisée pendant la durée de vie du processus. Les autres processus PHP ne peuvent pas y accéder. Si Memcache est utilisé, une entrée du cache peut être partagée pour plusieurs processus PHP, sur différentes machaines, suivant la configuration utilisée.
Si un grand nombre d'entrées partagées du cache stockées par exemple dans Memcache expirent, plusieurs clients se verront informés de l'absence de l'entrée dans le cache. A ce moment, vu que ces clients ne peuvent récupérer les données depuis le cache, ils tentent de les récupérer depuis le serveur de base de données. Tant que l'entrée du cache n'est pas mise à jour, de plus en plus de clients contacteront le serveur de base de données. Dans le pire des cas, cela peut conduire à une perte totale du service.
La surcharge peut être évitée en utilisant un gestionnaire de stockage qui limite la réutilisation d'une entrée du cache à un nombre limité de clients. Alors, si le cas extrême est rencontré, ce ne sera qu'un nombre limité de clients qui tenteront de mettre à jour l'entrée du cache en même temps.
De plus, le mécanisme de défense interne de type slam peut et doit être utilisé.
Si cette défense est activée, une entrée du cache expirée reçoit une extension
de durée de vie. Le premier client qui récupère une entrée manquante car expirée
tentera de la mettre à jour pendant la durée de cette extension. Tous les autres
clients demandant cette entrée sont temporairement servis depuis le cache malgré
le fait que le TTL
original de cette entrée a expiré. Les autres
clients ne recevront pas comme réponse le fait que l'entrée n'est pas présente
dans le cache tant que cette extension de vie ne sera pas atteinte.
mysqlnd_qc.slam_defense=1 mysqlnd_qc.slam_defense_ttl=1
Le mécanisme de défense de type slam est activé avec la direction de configuration PHP
mysqlnd_qc.slam_defense
.
L'extension de durée de vie d'une entrée du cache est définie avec la directive
mysqlnd_qc.slam_defense_ttl
.
La fonction mysqlnd_qc_get_core_stats() retourne un tableau de statistiques.
Les statistiques slam_stale_refresh
et slam_stale_hit
sont incrémentées si une défense de type slam est mise en place.
Il n'est pas possible de fournir une recommandation générale concernant la configuration de la défense de type slam. Les utilisateurs sont encouragés à surveiller et tester leur configuration et d'ajuster leur configuration en conséquent.