Retour au blog

Comment accélérer Drupal avec les bons caches : OPcache, APCu et un backend partagé (Redis ou Memcached)

2025-08-1310 min de lecture

Si votre site Drupal semble lent, le cache est généralement la solution. Pas une solution unique, cependant. Différentes couches résolvent différents problèmes. C'est pourquoi OPcache, APCu et un backend partagé comme Redis ou Memcached apparaissent souvent ensemble. Chacun accélère une partie spécifique de la pile. Utilisez-les bien et Drupal devient réactif. Utilisez-les mal et il traîne toujours.

Attention : choisissez un seul backend partagé pour les bacs de cache Drupal. Utilisez Redis ou Memcached, pas les deux pour les mêmes bacs.

En bref : à faire absolument vs avancé

  • À faire absolument : Activez OPcache dans PHP. Activez APCu pour les caches locaux. Choisissez un backend partagé pour les bacs dans les configurations multi-serveurs.
  • Avancé : Mappez des bacs spécifiques, réglez les délais d'attente du client Redis, ajustez la taille des éléments Memcached, compressez les valeurs Redis volumineuses, dimensionnez les pools en fonction de l'utilisation réelle.

Guide de décision rapide

ConfigurationÀ faire absolumentBackend partagéIdéal pourNotes
Serveur uniqueOPcache + APCuOptionnelPetits sites sur un nœudLe cache de base de données peut suffire. Ajoutez Redis ou Memcached si le trafic augmente.
Serveurs multiplesOPcache + APCuRedis ou MemcachedClusters répartis en chargeUtilisez un backend partagé pour render, dynamic page cache, page, default, data.
Contenu à haute variabilitéOPcacheRedisTagging et invalidation complexesLes structures et les options de persistance aident.
Léger et simpleOPcacheMemcachedCache pur avec une surcharge minimaleTrès rapide, éphémère par conception.

Ce que fait chaque cache

  • OPcache : Accélère PHP lui-même en mettant en cache les scripts compilés.
  • APCu : Cache clé-valeur local, par serveur, pour les recherches minuscules.
  • Redis : Stockage de données partagé en mémoire pour les caches, les files d'attente, les verrous, les sessions.
  • Memcached : Cache clé-valeur partagé en mémoire, très simple et rapide.

Comment cela s'intègre dans Drupal

  • OPcache : Activez-le au niveau de la couche PHP. Ce n'est pas un module Drupal.
  • APCu : Sert les caches locaux et les données d'amorçage.
  • Redis ou Memcached : Mappez render, dynamic page cache, page, default, data au backend partagé. Prend également en charge les sessions, les verrous et les files d'attente.

Connexe : Cache d'état (Drupal 10.3+, activé par défaut dans Drupal 11). Voir l'article séparé pour plus de détails : Accélérez le backend Drupal avec $settings['state_cache'].

Astuce de pro : Dans les configurations multi-serveurs, conservez bootstrap dans APCu pour une latence ultra faible, et déplacez le reste vers le backend partagé.

Recettes rapides pour settings.php

Collez, puis adaptez.

Redis

Intégration Drupal

$settings['container_yamls'][] = 'modules/contrib/redis/redis.services.yml';
$settings['redis.connection']['interface'] = 'PhpRedis';
$settings['redis.connection']['host'] = '127.0.0.1';
$settings['redis.connection']['port'] = 6379;
$settings['cache']['default'] = 'cache.backend.redis';
$settings['cache']['bins']['render'] = 'cache.backend.redis';
$settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.redis';
$settings['cache']['bins']['page'] = 'cache.backend.redis';

Réglage des performances

// Compression optionnelle
$settings['redis_compress_length'] = 100;
$settings['redis_compress_level'] = 1;
// Délais d'attente du client (PhpRedis)
$settings['redis.connection']['timeout'] = 1.0;
$settings['redis.connection']['read_timeout'] = 1.0;
$settings['redis.connection']['retry_interval'] = 100;
$settings['redis.connection']['persistent'] = TRUE;
  • container_yamls : Enregistre les services Redis.
  • interface : Choisit le client. PhpRedis est une extension native.
  • host/port : Spécifie la cible de connexion. Préférez un socket Unix sur le même hôte.
  • cache.default : Définit le backend par défaut pour les bacs non mappés.
  • bins : Mappe des bacs spécifiques à Redis.
  • compress_length/level : Compresse les valeurs volumineuses pour économiser de la mémoire.
  • timeouts/persistent : Définit les délais d'attente de connexion/lecture et réutilise les connexions.

Memcached

Intégration Drupal

$settings['container_yamls'][] = 'modules/contrib/memcache/memcache.services.yml';
$settings['memcache']['servers']['127.0.0.1:11211'] = 'default';
$settings['memcache']['bins']['render'] = 'default';
$settings['memcache']['bins']['dynamic_page_cache'] = 'default';
$settings['memcache']['bins']['page'] = 'default';
$settings['cache']['default'] = 'cache.backend.memcache';
  • container_yamls : Enregistre les services Memcache.
  • servers : Définit la liste des serveurs et le nom du pool.
  • bins : Mappe les bacs à un pool.
  • cache.default : Définit le backend par défaut pour les bacs non mappés.

APCu pour les bacs locaux

// Nécessite le module backend APCu
$settings['cache']['bins']['bootstrap'] = 'cache.backend.apcu';
  • bootstrap : Conserve les données d'amorçage à chaud dans le processus pour une latence minimale.

Paramètres d'exécution/serveur (en dehors de settings.php)

Paramètres PHP (php.ini)

OPcache

opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=192
opcache.max_accelerated_files=16229
opcache.validate_timestamps=0
opcache.revalidate_freq=0
opcache.interned_strings_buffer=16
opcache.fast_shutdown=1
  • opcache.enable : Active OPcache pour FPM ou Apache.
  • opcache.enable_cli : Maintient OPcache désactivé pour la CLI.
  • opcache.memory_consumption : Alloue un pool de mémoire pour les scripts compilés.
  • opcache.max_accelerated_files : Définit la taille de la table de hachage.
  • opcache.validate_timestamps : Vérifie les horodatages des fichiers pour les modifications. Réglez sur 0 pour les déploiements construits une seule fois.
  • opcache.revalidate_freq : Définit les secondes entre les vérifications d'horodatage lorsque validate_timestamps = 1.
  • opcache.interned_strings_buffer : Alloue de la mémoire pour les chaînes partagées.
  • opcache.fast_shutdown : Permet un arrêt de requête plus rapide.

APCu

apc.enabled=1
apc.enable_cli=0
apc.shm_size=128M
apc.ttl=0
apc.gc_ttl=3600
  • apc.enabled : Active APCu pour FPM.
  • apc.enable_cli : Maintient APCu désactivé pour la CLI.
  • apc.shm_size : Définit la mémoire partagée totale.
  • apc.ttl : Définit le TTL par défaut pour les entrées.
  • apc.gc_ttl : Définit le temps de conservation des entrées orphelines.

Serveur Redis (redis.conf)

maxmemory 2gb
maxmemory-policy allkeys-lru
timeout 1
tcp-keepalive 60
  • maxmemory : Définit le plafond de mémoire.
  • maxmemory-policy : Définit le comportement d'éviction lorsqu'il est plein.
  • timeout : Définit le délai d'attente du client inactif en secondes.
  • tcp-keepalive : Définit l'intervalle des sondes de maintien de connexion.

Serveur Memcached (options)

memcached -m 2048 -I 4m -f 1.25 -o slab_reassign,slab_automove
  • -m : Définit la mémoire totale en Mo.
  • -I : Définit la taille maximale de l'élément.
  • -f : Définit le facteur de croissance pour les classes de slabs.
  • -o slab_reassign,slab_automove : Active le rééquilibrage des slabs.

Règles rapides de dimensionnement

CacheParamètre cléRègle rapide (Mo)
OPcacheopcache.memory_consumptionMo = (codebase_Mo × 3) + 32
OPcacheopcache.max_accelerated_files≈ 1,5 × fichiers PHP (utilisez 10000, 16229, 32531)
APCuapc.shm_sizeMo ≈ (clés × (octets_élément_moyen + 100) × 1,2) ÷ 1 000 000
RedismaxmemoryMo ≈ (éléments × (octets_élément_moyen + 50) × 1,3) ÷ 1 000 000
Memcached-mMo ≈ (éléments × octets_élément_moyen × 1,3) ÷ 1 000 000
Memcached-ICommencez à 4 Mo ; augmentez si nécessaire

Mythes courants

  1. Mythe : OPcache met en cache le HTMLVérité : Il met en cache le code PHP compilé.
  2. Mythe : APCu fonctionne entre les serveursVérité : Il est local à un processus serveur.
  3. Mythe : Redis est toujours meilleur que MemcachedVérité : Choisissez en fonction de vos besoins.
  4. Mythe : les échecs de cache signifient que quelque chose est casséVérité : Les échecs se produisent et se réchauffent avec le trafic.

Liste de contrôle de configuration rapide

  • OPcache :
    • Activez l'extension dans PHP.
    • Réglez la taille de la mémoire et les paramètres de revalidation pour la production.
    • Assurez-vous que opcache.memory_consumption est suffisant pour contenir votre base de code.
  • APCu :
    • Installez l'extension PHP.
    • Confirmez les paramètres CLI et FPM si vous exécutez les deux.
    • Dimensionnez apc.shm_size avec une marge pour éviter les évictions.
  • Redis :
    • Installez le serveur et l'extension PHP.
    • Ajoutez le module Redis Drupal et mappez les bons bacs de cache.
    • Définissez les délais d'attente du client et envisagez les sessions, les verrous et les files d'attente.
  • Memcached :
    • Installez le serveur et l'extension PHP.
    • Ajoutez le module Memcache Drupal et mappez les bacs souhaités.
    • Définissez -I pour la taille maximale de l'élément ; assurez-vous que l'application tolère la perte de cache.

Évitez ces pièges

  • Évitez de mélanger Redis et Memcached pour le même bac.
  • Évitez de sous-dimensionner les caches. Surveillez les évictions et le taux de succès.
  • Évitez le sur-caching. Concentrez-vous sur les données coûteuses et réutilisables.
  • Évitez de casser l'invalidation. Respectez les balises et les contextes de cache.

Comment mesurer le succès

  • Tendances du temps de réponse : Le temps jusqu'au premier octet devrait diminuer après le réchauffement.
  • Charge de la base de données : Moins de requêtes par requête et moins de CPU sur la base de données.
  • Taux de succès : Suivez les taux de succès du cache. Si les taux de succès restent bas, revoyez le mappage des bacs et les TTL.
  • Journaux d'erreurs : Surveillez les erreurs de connexion ou les délais d'attente de Redis ou Memcached.

Pensées finales

Commencez par OPcache, ajoutez APCu, puis Redis ou Memcached pour les bacs partagés. Restez simple, mesurez les résultats et ajustez.