Optimisation PHP 8 : OpCache et JIT expliqués
Votre application PHP 8 semble lente sous charge. Vous avez optimisé les requêtes, ajouté de la mise en cache, mais les temps de réponse restent élevés. Le coupable pourrait être la surcharge d'exécution de PHP lui-même. Deux fonctionnalités puissantes—OpCache et JIT—peuvent considérablement accélérer votre code, mais seulement si elles sont correctement configurées. Ce guide explique comment elles fonctionnent et comment les optimiser pour des charges de travail réelles.
Qu'est-ce qu'OpCache et pourquoi c'est important
PHP est un langage interprété : chaque requête analyse et compile normalement vos fichiers sources en bytecode avant de les exécuter. OpCache stocke ce bytecode compilé en mémoire partagée, de sorte que les requêtes suivantes sautent l'analyse et la compilation. Le résultat ? Une utilisation CPU réduite et des temps de réponse plus rapides.
OpCache est activé par défaut dans de nombreuses configurations de production, mais les paramètres par défaut sont conservateurs. L'optimiser peut entraîner des améliorations de débit de 2 à 3x pour les applications limitées par le CPU.
Directives de configuration OpCache essentielles
- opcache.enable : Définir à 1 pour activer. (Par défaut : 1 en production, 0 en CLI sauf override.)
- opcache.memory_consumption : Taille de la mémoire partagée en Mo. Commencez par 128 Mo ; augmentez si vous constatez une utilisation élevée de
opcache.memory_usage. - opcache.max_accelerated_files : Nombre maximum de fichiers mis en cache. Définissez un nombre premier supérieur à votre total de fichiers PHP (par exemple, 10007).
- opcache.validate_timestamps : Lorsque défini à 1, PHP vérifie les horodatages des fichiers pour détecter les modifications. Définissez à 0 en production pour éviter les appels stat ; vous devez vider manuellement le cache après les déploiements.
- opcache.revalidate_freq : Fréquence (en secondes) de vérification des horodatages si validate_timestamps=1. Définissez à 0 pour le développement, 60+ pour la production.
- opcache.interned_strings_buffer : Mémoire pour les chaînes internées (Mo). Augmentez à 16 ou 32 pour les grandes applications.
- opcache.fast_shutdown : Obsolète depuis PHP 7.2+, supprimé dans PHP 8.0. Ignorez.
- opcache.preload : Chemin vers un script de préchargement (PHP 7.4+). Le préchargement compile et met en cache les fichiers au démarrage, éliminant la surcharge par requête pour les classes critiques.
Paramètres OpCache recommandés pour la production
; php.ini
opcache.enable=1
opcache.memory_consumption=256
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0
opcache.revalidate_freq=0
opcache.interned_strings_buffer=32
opcache.preload=/path/to/preload.php
opcache.preload_user=www-data
Après avoir modifié les paramètres, redémarrez PHP-FPM. Surveillez avec opcache_get_status() pour vérifier le taux de réussite et l'utilisation de la mémoire.
Comprendre le JIT dans PHP 8
La compilation JIT (Just-In-Time) pousse OpCache un peu plus loin : elle compile le bytecode en code machine natif à l'exécution. Cela peut considérablement accélérer les tâches gourmandes en CPU comme les calculs mathématiques, mais cela fait peu pour les requêtes web typiques dominées par les E/S (base de données, système de fichiers, réseau).
JIT fait partie d'OpCache, vous devez donc d'abord activer OpCache. Dans PHP 8, JIT est configuré via opcache.jit et opcache.jit_buffer_size.
Directives de configuration JIT
- opcache.jit : Contrôle le mode JIT. Utilisez
tracing(par défaut) oufunction. La valeur est un code CRTO à 4 chiffres :CRTOoù C=optimisation spécifique au CPU, R=allocation de registres, T=déclencheur, O=niveau d'optimisation. Pour la plupart des applications,opcache.jit=tracingconvient. - opcache.jit_buffer_size : Mémoire pour le code JIT en octets. Commencez par 64M ou 128M. Si défini à 0, JIT est désactivé.
- opcache.jit_hot_loop, opcache.jit_hot_func, opcache.jit_hot_return, opcache.jit_hot_side_exit : Seuils pour la détection de code chaud. Les valeurs par défaut sont généralement correctes.
Paramètres JIT recommandés
opcache.jit=tracing
opcache.jit_buffer_size=128M
Remarque : JIT ne fonctionne qu'avec OpCache activé. En CLI, vous devrez peut-être définir opcache.enable_cli=1 pour tester JIT.
OpCache vs JIT : quand utiliser lequel
| Fonctionnalité | OpCache | JIT |
|---|---|---|
| Bénéfice principal | Met en cache le bytecode compilé | Compile le bytecode en code natif |
| Idéal pour | Toutes les applications PHP | Scripts gourmands en CPU, longue durée |
| Impact sur les applications I/O-bound | Élevé (réduit l'analyse/compilation) | Faible à nul |
| Surcharge mémoire | Modérée | Buffer supplémentaire |
| Complexité | Faible | Moyenne |
Guide d'optimisation étape par étape
- Activez OpCache avec les paramètres recommandés ci-dessus.
- Surveillez OpCache en utilisant
opcache_get_status()ou des outils comme OpCache GUI. Visez un taux de réussite supérieur à 99%. - Ajustez la mémoire si
opcache.memory_usageest proche de la limite. - Envisagez le préchargement pour les grands frameworks (Laravel, Symfony). Créez un script de préchargement qui requiert les classes fréquemment utilisées.
- Activez JIT uniquement si votre application est limitée par le CPU. Testez avec et sans JIT pour mesurer l'impact.
- Benchmarkez avec des outils comme
ab,wrkousiege. Comparez les requêtes par seconde et la latence. - Déployez les changements progressivement et surveillez les logs d'erreurs pour détecter les problèmes.
Pièges courants et bonnes pratiques
- Ne désactivez pas validate_timestamps en développement : Vous perdrez du temps à vous demander pourquoi les modifications de code ne prennent pas effet.
- Videz OpCache au déploiement : Si validate_timestamps=0, vous devez réinitialiser OpCache (par exemple, en redémarrant PHP-FPM ou en appelant
opcache_reset()). - JIT n'est pas une solution miracle : Pour les applications CRUD typiques, OpCache seul apporte la plupart des gains.
- Surveillez la mémoire : Le buffer JIT et la mémoire OpCache s'ajoutent à l'empreinte de PHP. Assurez-vous que votre serveur dispose de suffisamment de RAM.
- Utilisez le préchargement avec précaution : Les fichiers préchargés sont toujours en mémoire ; évitez de tout précharger.
FAQ
Le JIT améliore-t-il les performances de toutes les applications PHP ?
Non. Le JIT bénéficie aux tâches gourmandes en CPU comme les calculs complexes ou le traitement de données. Pour les applications web I/O-bound (requêtes de base de données, appels API), les gains sont minimes. OpCache seul offre souvent la plus grande accélération.
Comment savoir si OpCache fonctionne ?
Vérifiez phpinfo() pour le statut d'OpCache, ou appelez opcache_get_status() dans un script. Recherchez opcache_enabled => true et un nombre élevé de hits par rapport aux misses.
Puis-je utiliser JIT avec PHP 7 ?
Non. JIT a été introduit dans PHP 8.0. PHP 7 ne supporte qu'OpCache. Si vous êtes sur PHP 7, concentrez-vous sur l'optimisation d'OpCache et envisagez de passer à PHP 8 pour JIT et d'autres améliorations de performances.
Prêt à analyser les performances de votre serveur ? Découvrez notre Analyseur de Logs Nginx pour tirer des informations de vos logs d'accès et identifier les goulots d'étranglement.