OPcache

Cache du bytecode PHP : fonctionnement, configuration et bonnes pratiques de déploiement.

Créé le 11 juin 2026·Mis à jour le 11 juin 2026

Introduction


Avant d'exécuter un fichier PHP, l'interpréteur doit le lire, l'analyser syntaxiquement et le compiler en bytecode. Ces opérations se répètent à chaque requête, sur chaque fichier inclus, même si le code source n'a pas changé.

OPcache supprime ce coût en conservant le bytecode compilé en mémoire partagée. Dès la deuxième requête, PHP charge directement le bytecode sans retoucher le fichier source.

Cycle d'exécution sans OPcache


Sans OPcache, chaque requête parcourt l'intégralité de la chaîne de compilation :

Requête → Lecture du fichier .php → Analyse lexicale → Analyse syntaxique
       → Compilation en bytecode → Exécution → Réponse

Dans une application Symfony ou Laravel, une seule requête peut inclure plusieurs centaines de fichiers. Répété à chaque requête, ce travail représente une part significative du temps d'exécution.

Cycle d'exécution avec OPcache


Avec OPcache, la compilation n'a lieu qu'une seule fois, à la première requête sur un fichier donné :

Requête 1 → Compilation → Stockage en mémoire partagée → Exécution → Réponse
Requête N → Lecture du bytecode en mémoire → Exécution → Réponse

Les requêtes suivantes sautent directement à l'exécution du bytecode.

Activation et configuration


OPcache est inclus dans PHP depuis la version 5.5. Il est activé par défaut sur la plupart des distributions modernes. On peut le vérifier avec phpinfo() ou en ligne de commande :

php -m | grep OPcache

La configuration se fait dans php.ini ou dans un fichier dédié (par exemple /etc/php/8.x/fpm/conf.d/10-opcache.ini).

opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.revalidate_freq=0
opcache.validate_timestamps=0
opcache.save_comments=1

Paramètres clés


ParamètreDescription
opcache.memory_consumptionTaille de la mémoire partagée allouée, en mégaoctets
opcache.max_accelerated_filesNombre maximum de fichiers en cache
opcache.revalidate_freqFréquence en secondes de vérification des modifications de fichiers
opcache.validate_timestampsActive ou désactive la vérification des timestamps de fichiers
opcache.interned_strings_bufferMémoire dédiée à l'intern des chaînes de caractères

En production, il est recommandé de désactiver validate_timestamps (opcache.validate_timestamps=0) pour supprimer toute vérification de fichier à chaque requête. Dans ce cas, vider le cache OPcache manuellement lors des déploiements est obligatoire.

Vider le cache lors d'un déploiement


Avec validate_timestamps=0, OPcache ne détecte pas les changements de fichiers. Il faut vider le cache après chaque déploiement.

<?php
opcache_reset();

Cette fonction vide l'intégralité du cache OPcache. Certains hébergeurs ou orchestrateurs fournissent des mécanismes spécifiques (redémarrage du pool PHP-FPM, signal SIGUSR2, etc.).

Surveillance


OPcache expose des statistiques via opcache_get_status() :

<?php

$status = opcache_get_status();

echo 'Fichiers en cache : ' . $status['opcache_statistics']['num_cached_scripts'];
echo 'Hit rate : ' . round($status['opcache_statistics']['opcache_hit_rate'], 2) . '%';
echo 'Mémoire utilisée : ' . round($status['memory_usage']['used_memory'] / 1024 / 1024, 2) . ' Mo';

Un hit rate inférieur à 90 % en production indique que le cache est trop petit ou que max_accelerated_files est insuffisant.

JIT - Just In Time


Depuis PHP 8.0, OPcache peut activer le compilateur JIT. Plutôt que d'exécuter le bytecode via l'interpréteur, le JIT compile certaines parties du bytecode directement en code machine natif au moment de l'exécution.

opcache.jit=tracing
opcache.jit_buffer_size=128M

Le JIT apporte des gains significatifs sur les tâches intensives en CPU (calculs mathématiques, traitement d'image, algorithmes), mais son impact sur les applications web classiques (I/O bound, base de données) est plus modeste.

Résumé


ParamètreValeur recommandée (production)
opcache.enable1
opcache.memory_consumption128 à 512 selon la taille de l'app
opcache.validate_timestamps0 (vider manuellement au déploiement)
opcache.max_accelerated_files10000 à 50000
opcache.jittracing si CPU-bound

OPcache est la première optimisation à mettre en place sur tout projet PHP en production. Son activation seule peut réduire le temps d'exécution de 30 à 50 % sur les applications de taille moyenne.