OPcache
OPcache : extension standard de PHP qui met en cache le bytecode compilé des scripts en mémoire partagée, évitant la recompilation à chaque requête — accélérateur principal d'une application PHP en production.
OPcache est une extension standard de PHP, livrée avec le langage depuis PHP 5.5 et activée par défaut en production, qui met en cache le bytecode compilé des scripts PHP en mémoire partagée. Son rôle est de supprimer le coût de compilation répétée à chaque requête : au lieu de relire, parser et compiler un même fichier PHP des milliers de fois, OPcache le compile une fois et sert ensuite le bytecode depuis la mémoire. Pour une application PHP en production, c'est l'accélérateur de performance le plus impactant, et le moins connu de beaucoup d'équipes.
Définition technique
Comment fonctionne OPcache
À la première requête qui déclenche le chargement d'un fichier PHP, OPcache effectue le travail normal de l'interpréteur : lecture du fichier, parsing, compilation en opcodes, puis stockage du bytecode en mémoire partagée (shared memory). Les requêtes suivantes qui chargent le même fichier sautent directement à la dernière étape : OPcache récupère le bytecode depuis la mémoire et le passe à la Zend VM pour exécution. Le fichier source sur disque n'est plus touché.
Cette mémoire partagée est allouée au démarrage de PHP-FPM (ou du SAPI utilisé) et survit entre les requêtes — c'est pour ça qu'OPcache n'a d'intérêt qu'avec un SAPI persistant comme PHP-FPM. En CLI, OPcache est désactivé par défaut puisque chaque exécution démarre et meurt indépendamment.
Les paramètres clés
opcache.enable— active/désactive l'extension. Mettre à1en production.opcache.memory_consumption— taille de la mémoire partagée allouée au cache, en mégaoctets. Une valeur typique est 128 à 256 pour une application complexe comme WordPress.opcache.max_accelerated_files— nombre maximum de fichiers que le cache peut contenir. Doit être supérieur au nombre total de fichiers PHP de l'application (compter large : 10 000 à 20 000).opcache.interned_strings_buffer— mémoire allouée à la déduplication des chaînes de caractères. Améliore les gains de mémoire sur les applications qui manipulent beaucoup de symboles (PHP interne les noms de classes, fonctions, constantes).opcache.validate_timestamps— détermine si OPcache vérifie les modifications de fichiers. À0en production immuable, à1en développement.opcache.revalidate_freq— fréquence de revalidation en secondes quandvalidate_timestamps=1. Ignoré quandvalidate_timestamps=0.
Enjeux actuels
Le cas du filesystem immuable
Le gain maximum d'OPcache se manifeste quand on peut désactiver complètement la revalidation des fichiers. C'est exactement ce que permettent les architectures PaaS modernes : le code est figé dans une image immuable au moment du build, aucun processus ne peut le modifier en cours d'exécution. Dans ce contexte, validate_timestamps=0 est gratuit et sans risque — il ne peut pas y avoir de dérive entre la version du fichier sur disque et la version en cache.
Sur un hébergement traditionnel où le code peut être modifié par FTP ou par un éditeur de thème, cette option est dangereuse : un fichier modifié ne sera pas pris en compte, ce qui peut causer des bugs inexplicables. C'est l'une des raisons pour lesquelles les PaaS imposant l'immuabilité offrent mécaniquement de meilleures performances PHP que l'hébergement mutualisé classique.
Préchargement (preloading)
Depuis PHP 7.4, OPcache supporte le preloading : un script exécuté au démarrage de PHP-FPM charge en mémoire un ensemble de fichiers qui seront disponibles pour toutes les requêtes, sans même avoir besoin d'un require explicite. Pour des frameworks lourds (Symfony, Laravel), cela peut réduire davantage le temps de démarrage d'une requête — au prix d'un redémarrage de PHP-FPM à chaque déploiement pour rafraîchir le preload.
Applications pratiques
Sur WordPress, OPcache est souvent sous-exploité : l'hébergeur l'active avec des valeurs par défaut conservatrices et validate_timestamps=1. Passer à une configuration optimisée sur un PaaS immuable — avec validate_timestamps=0, memory_consumption=128, max_accelerated_files=20000, interned_strings_buffer=16 — transforme le profil de performance de l'application. Je détaille cette configuration dans mon article sur la sécurisation et l'optimisation de WordPress via Infrastructure as Code.
Questions fréquentes
Pourquoi OPcache accélère-t-il PHP ?
PHP est un langage interprété : à chaque requête, l'interpréteur doit lire les fichiers sources, les parser, les compiler en bytecode intermédiaire (opcodes), puis exécuter ce bytecode. OPcache court-circuite les trois premières étapes : au premier chargement d'un fichier, il stocke le bytecode compilé en mémoire partagée, et toutes les requêtes suivantes réutilisent directement ce bytecode sans relire ni reparser le fichier source. Sur une application complexe comme WordPress, cela supprime une grande partie du travail de démarrage d'une requête.
À quoi sert le paramètre opcache.validate_timestamps ?
Par défaut (validate_timestamps=1), OPcache vérifie périodiquement si les fichiers PHP ont été modifiés sur le disque. Si un fichier a changé, le cache est invalidé et le fichier est recompilé. Ce comportement est utile en développement (on veut voir ses changements immédiatement) mais coûteux en production : chaque requête fait un stat() sur chaque fichier chargé. En configurant validate_timestamps=0, OPcache cesse de faire cette vérification — mais on devient responsable d'invalider le cache manuellement à chaque déploiement (ou de redémarrer PHP-FPM, ce que font automatiquement la plupart des PaaS modernes).
OPcache et PaaS à filesystem immuable : pourquoi c'est un match parfait ?
Sur un PaaS comme Upsun, Fly.io ou Heroku, le code applicatif est construit dans une image immuable — une fois déployée, les fichiers PHP ne peuvent plus changer. Dans ce contexte, opcache.validate_timestamps=0 est l'option idéale : PHP n'a aucune raison de revérifier les fichiers puisqu'ils ne peuvent pas être modifiés. À chaque nouveau déploiement, le runtime est reconstruit, OPcache est initialisé avec le nouveau bytecode, et toutes les vérifications disque disparaissent. C'est un gain de performance gratuit offert par la contrainte architecturale de l'immuabilité.