Le WordPress d'aujourd'hui, décodé pour les développeurs

Hébergement & serveurs

Redis Object Cache contre W3 Total Cache : le conflit qui double les requêtes

Le site est plus lent après avoir activé Redis Object Cache en plus de W3 Total Cache ? Diagnostic d'un conflit de cache d'objets fréquent, et configuration qui les fait cohabiter.

Par WordPress Développement • 7 juillet 2021 • 5 min de lecture • Aucun commentaire
Redis Object Cache contre W3 Total Cache : le conflit qui double les requêtes

Combien de requêtes SQL une page produit-elle sur un site correctement caché ? Sur ce projet, la réponse attendue tournait autour de dix requêtes par page grâce à W3 Total Cache déjà en place. Après l’ajout de Redis Object Cache, censé accélérer encore les choses, le nombre de requêtes a doublé au lieu de baisser, et le temps de génération des pages s’est allongé.

Ce résultat contre-intuitif s’explique par un conflit classique entre deux mécanismes de cache d’objets actifs simultanément : W3 Total Cache intègre son propre cache d’objets, configurable pour utiliser Redis comme backend, et l’extension Redis Object Cache installée séparément fait exactement la même chose, via son propre fichier object-cache.php déposé dans wp-content.

Le symptôme : requêtes dupliquées et lenteur inattendue

Avec Query Monitor activé sur l’environnement de test, le nombre de requêtes MySQL par page affichait presque le double de la normale, et le temps de génération de la page dépassait largement les habitudes du site. Ce genre de régression après l’ajout d’un outil censé accélérer les choses doit toujours faire suspecter un conflit entre deux mécanismes qui font le même travail.

Comprendre le mécanisme du cache d’objets

L'essentiel à retenir : Deux extensions de cache d'objets actives ensemble s'écrivent l'une par-dessus l'autre ; Le temps de génération des pages augmente au lieu de baisser ; Une seule extension doit gérer le cache d'objets, jamais deux

WordPress dispose nativement d’un cache d’objets en mémoire, valable uniquement pour la durée d’une requête HTTP (non persistant par défaut). Une extension de cache d’objets persistant, comme Redis Object Cache, remplace ce mécanisme par défaut en déposant un fichier object-cache.php à la racine de wp-content, ce fichier étant chargé très tôt dans le cycle de démarrage de WordPress.

Le problème survient quand W3 Total Cache, configuré pour utiliser également Redis comme backend de cache d’objets dans ses propres réglages, tente d’écrire ses propres clés de cache en parallèle de celles gérées par le fichier object-cache.php déposé par l’autre extension. Les deux systèmes finissent par se marcher dessus, invalidant mutuellement leurs entrées respectives plus souvent qu’ils ne les servent depuis le cache.

Vérifier lequel des deux est réellement actif

La commande WP-CLI suivante confirme quel mécanisme de cache d’objets est effectivement chargé :

wp cache type
# Redis (via Redis Object Cache)
# ou
# W3TC (via le module Object Cache de W3 Total Cache)

Il est également possible de vérifier directement la présence et le contenu du fichier concerné :

cat wp-content/object-cache.php | head -5

Le correctif : un seul gestionnaire de cache d’objets

La règle est simple une fois le conflit identifié : un seul système doit gérer le cache d’objets Redis, jamais deux en parallèle. Deux options s’offrent, selon les préférences de configuration déjà en place :

  1. Désactiver le module « Object Cache » dans les réglages de W3 Total Cache et laisser Redis Object Cache gérer seul le cache d’objets persistant
  2. Ou désinstaller Redis Object Cache et configurer entièrement le cache d’objets via l’interface native de W3 Total Cache, en pointant vers le même serveur Redis

La première option est généralement préférée quand Redis Object Cache est déjà bien connu de l’équipe, car son interface de diagnostic (statistiques de hits et misses en temps réel) est plus lisible que celle de W3 Total Cache sur ce module précis.

Vérifier après correctif

wp redis status
# Status: Connected
# Hits: 4821, Misses: 213, Ratio: 95.7 %

Un ratio de hits élevé, au-delà de 90 %, confirme que le cache fonctionne correctement une fois le doublon supprimé. Le nombre de requêtes MySQL par page, revérifié avec Query Monitor, doit alors retrouver son niveau initial, voire l’améliorer légèrement par rapport à la situation avant l’ajout de Redis.

Prévention pour la suite

Avant d’ajouter une extension de cache d’objets à un site qui utilise déjà une suite de cache complète comme W3 Total Cache ou WP Rocket, vérifier systématiquement si cette suite gère déjà elle-même le cache d’objets. Ajouter un second outil sans désactiver le premier ne fait jamais gagner en performance.

Ce conflit ne concerne que le cache d’objets, distinct du cache de page HTML géré par ailleurs par ces mêmes extensions : le cache de page continue de fonctionner normalement pendant tout l’incident, ce qui explique pourquoi le problème passe parfois inaperçu plusieurs jours avant d’être identifié.

En résumé

Un site plus lent après l’ajout d’un second cache d’objets révèle presque toujours le même schéma : deux mécanismes redondants qui s’invalident mutuellement plutôt que de coopérer. Vérifier quel fichier object-cache.php est réellement chargé, désactiver le module en doublon dans la suite de cache existante, puis confirmer le ratio de hits Redis après correctif suffit à retrouver, et souvent dépasser, les performances d’avant l’incident.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi