...

WordPress Opcache : les erreurs de configuration les plus fréquentes et leurs solutions

wordpress opcache est souvent activé, mais rarement réglé correctement : Trop peu de mémoire, des limites de fichiers trop étroites et un mauvais contrôle de l'horodatage conduisent directement à des échecs de cache et à des temps de chargement sensibles. Dans ce guide, je présente des erreurs de configuration typiques, je donne des valeurs de référence fiables et j'explique comment tu peux voir si ton cache fonctionne ou s'il occupe ton CPU.

Points centraux

Les aspects clés suivants t'aident à identifier rapidement les configurations erronées et à y remédier de manière ciblée.

  • Mémoire: dimensionner opcache.memory_consumption de manière réaliste
  • Fichiers: définir opcache.max_accelerated_files pour qu'il corresponde à la base de code
  • Chaînes: augmenter opcache.interned_strings_buffer pour WordPress
  • Timestamps: choisir judicieusement validate_timestamps et revalidate_freq
  • SuiviVérifier régulièrement le taux de réussite, les redémarrages et les clés.

Pourquoi des paramètres Opcache défectueux ralentissent WordPress

Avec Opcache PHP compile ton code une fois et fournit ensuite du bytecode directement depuis la mémoire de travail, mais des valeurs incorrectes font perdre cet avantage. Si le cache est trop petit, il écrase constamment les entrées, ce qui entraîne des recompilations fréquentes et des pics de charge. De même, trop peu de „fichiers accélérés“ empêchent que tous les fichiers PHP nécessaires atterrissent dans le cache, ce qui entraîne des échecs de cache évitables. Si les chaînes internes sont trop limitées, WordPress perd en efficacité pour les chaînes de caractères répétitives, ce qui est particulièrement important pour de nombreux plugins. Je contrôle de tels effets par le biais du taux de hits, du nombre de clés mises en cache et des redémarrages - ces trois indicateurs permettent de savoir très rapidement si la configuration est efficace.

Dimensionner correctement la mémoire : opcache.memory_consumption

Je mets opcache.memory_consumption pas aveuglément à 32 ou 64 Mo, car les installations modernes de WordPress les dépassent rapidement. Pour les petits blogs, je commence avec 128 Mo, pour les sites volumineux, je prévois 256 à 512 Mo, afin de ne pas déplacer continuellement des entrées. Au fur et à mesure de la croissance du site, je vérifie la mémoire Opcache libre ainsi que le compteur de redémarrages ; si les redémarrages augmentent ou si le taux de réussite diminue, j'augmente progressivement la valeur. Un bref test de charge après les mises à jour des plugins montre si le cache a suffisamment d'air ou s'il fonctionne déjà à la limite. Les personnes qui mettent en place un nouveau système trouveront dans cette brochure compacte des informations sur le fonctionnement du système. Configuration de l'OPcache des valeurs d'orientation supplémentaires, que j'adapte ensuite à la quantité réelle de fichiers.

Définir correctement l'index des fichiers : opcache.max_accelerated_files

Avec opcache.max_accelerated_files je définis le nombre de fichiers PHP que le cache peut gérer, et je fixe toujours la valeur au-dessus du nombre réel de fichiers. Je détermine le nombre côté serveur, par exemple avec „find . -iname „*.php“ | wc -l“, et j'ajoute 20 à 30 % de mémoire tampon pour que WordPress ne se heurte pas à cette limite après les mises à jour. Si la valeur par défaut reste à environ 3000, je passe à côté du potentiel de mise en cache et je génère des performances instables en cas de charge. Pour les installations de grande envergure, je me retrouve souvent dans des plages de 10 000 à 32 500, en fonction des plug-ins, des thèmes et des modules à utiliser obligatoirement. Je vérifie le résultat en comparant le nombre de clés mises en cache avec la valeur limite et en observant le taux de réussite lors des accès réels.

Le tampon de chaînes internes, un goulot d'étranglement caché

Le opcache.interned_strings_buffer est souvent négligée, bien que WordPress profite fortement des chaînes internes. Des valeurs de 16 à 32 Mo fonctionnent bien dans la pratique, car les thèmes et les plug-ins utilisent de nombreuses chaînes récurrentes que je garde ainsi efficacement en mémoire. Pour les configurations particulièrement grandes, je passe par étapes à 64 Mo si l'utilisation de la mémoire et les statistiques sur les chaînes l'indiquent. Une mémoire tampon trop petite fait perdre des validations qui, sinon, regrouperaient de nombreuses chaînes de caractères similaires en un seul endroit de la mémoire. Après l'adaptation, je contrôle si les redémarrages diminuent et si le temps de réponse général reste plus stable pour un trafic identique.

Comprendre les timestamps : validate_timestamps et revalidate_freq

Avec opcache.validate_timestamps je contrôle si Opcache détecte automatiquement les modifications de fichiers, ce qui reste important dans les environnements de production avec des mises à jour. Je laisse validate_timestamps à 1 et fixe revalidate_freq généralement à 60 secondes, afin que les plugins modifiés soient mis en ligne rapidement, sans avoir à vérifier constamment le disque dur. Dans les scripts de déploiement, je prévois un rechargement ciblé de PHP-FPM si je souhaite activer immédiatement des modifications critiques, afin d'éviter tout malentendu. Si l'on désactive les timestamps pour les rédacteurs actifs, on risque d'avoir de vieux artefacts et des erreurs difficiles à attribuer dans le frontend. Pour des questions pratiques plus approfondies sur le contrôle, un coup d'œil sur une version propre m'aide. Validation du cache, J'utilise les mêmes méthodes pour chaque version.

Un monitoring qui compte : Taux de hits, clés, redémarrages

Je mesure le succès de Opcache avec opcache_get_status(), car les chiffres démasquent immédiatement les fausses suppositions. Un taux de réussite d'au moins 99% montre que la plupart des requêtes rencontrent du bytecode et ne recompilent pas. Si les redémarrages augmentent ou si le nombre de clés mises en cache est à la limite, j'ajuste la mémoire ou la valeur accelerated-files. En outre, je surveille les fragments de mémoire, car une mémoire cache fragmentée peut entraîner de soudaines chutes de performance. Après les mises à jour des plug-ins, je vérifie à nouveau les indicateurs afin que le cache reste performant de manière cohérente et ne s'arrête pas seulement sous la charge.

opcache_get_status en pratique : lecture des ratios

Pour me faire rapidement une idée de la configuration, je lis les champs les plus importants et je les compare à mes objectifs :

  • opcache_statistics.hits/misses: le rapport détermine le taux de hits. Objectif : ≥ 99 % sous trafic réel.
  • opcache_statistics.num_cached_scriptsdoit être nettement inférieur à opcache.max_accelerated_files rester.
  • memory_usage.used_memory/free_memory/wasted_memory: Indique si la mémoire est rare ou fragmentée.
  • opcache_statistics.oom_restarts et hash_restartsSi elles augmentent, je redimensionne la mémoire ou les fichiers.
  • interned_strings_usage.buffer_size/used_memory: donne des indications sur le fait de savoir si le tampon de chaînes est suffisamment dimensionné.

Les petits assistants que j'exécute dans le shell ou dans une route admin sont utiles :

php -r 'var_export(opcache_get_status(false));'
php -i | grep -i opcache
php -r 'echo count(array_filter(get_included_files(), fn($f) => substr($f,-4)===".php"));'

Sur la base de ces chiffres, je décide si j'augmente la mémoire, si j'élargis l'index des fichiers ou si je redéclenche la fréquence de revalidation.

Valeurs Opcache recommandées par scénario

Au lieu de faire des recommandations générales, j'adapte Valeurs indicatives à la base de code et maintenir les variantes comparables. Les sites de petite et moyenne taille nécessitent nettement moins de ressources que les boutiques avec de nombreuses extensions. Je règle les environnements de développement de manière à ce que les modifications soient visibles sans délai, tandis que je rythme les contrôles de fichiers en production. Le tableau suivant résume les valeurs de départ habituelles, que j'ajuste ensuite avec précision dans le monitoring. Ceux qui planifient une croissance ont intérêt à calculer avec une marge de sécurité, afin que les releases n'imposent pas immédiatement une nouvelle planification.

Scénario opcache.memory_consumption opcache.max_accelerated_files opcache.interned_strings_buffer opcache.validate_timestamps opcache.revalidate_freq opcache.enable_cli
Petit/moyen 128 MO 10000 16 MO 1 60 0
Grand 256 à 512 Mo 32500 64 MO 1 60 0
Développement 128 à 256 Mo 10000-20000 16 à 32 Mo 1 0 0

OPcache dans le contexte de CLI, FPM et WP-CLI

Toutes les Environs utilise OPcache de la même manière, c'est pourquoi je fais attention aux différences entre FPM, Apache mod_php et CLI. Pour les tâches WP-CLI, Opcache n'apporte souvent aucun avantage, c'est pourquoi je laisse typiquement enable_cli à 0. Dans les piles de production, j'utilise PHP-FPM et je planifie les reloads de manière ciblée, afin que les déploiements caliente ne vident pas le cache de manière incontrôlée. Les cronjobs qui lancent des scripts PHP via CLI profitent plutôt d'un code PHP et d'E/S optimisés que de l'Opcache lui-même. Je documente ces chemins pour que les administrateurs sachent à quel endroit l'Opcache intervient et à quel endroit il n'intervient pas.

Echauffement après les déploiements : éviter les démarrages à froid

Après une version, le cache est froid - c'est précisément à ce moment-là que de nombreuses configurations s'effondrent brièvement. Je prévois donc un échauffement ciblé un :

  • Après le rechargement du FPM, je récupère automatiquement les itinéraires critiques (accueil, pages de produits/reportages, flux de recherche/boutique).
  • J'utilise des plans de site ou des listes d'URL prédéfinies pour amorcer 100 à 500 pages par vagues, plutôt que de tout inonder d'un coup.
  • Je répartis les requêtes d'échauffement sur 1 à 2 minutes afin d'éviter les pics de CPU et d'assurer un chargement cohérent du bytecode.

J'évite ainsi que de vrais utilisateurs paient le travail de compilation. Pour les boutiques en particulier, cette étape réduit les pics de temps de réponse immédiatement après les déploiements.

JIT, Preloading et File Cache : classification pour WordPress

Comme ces termes reviennent souvent, je les classe pour WordPress :

  • JIT (opcache.jit)Pour les charges de travail WP typiques (beaucoup d'E/S, peu de hotloops numériques), JIT ne fournit généralement pas de gain mesurable. Je laisse généralement de côté le JIT en production sur WordPress.
  • Préchargement (opcache.preload)Fonctionne bien avec des frameworks clairs et stables. WordPress charge les plugins et les thèmes de manière dynamique - dans ce cas, le préchargement est sujet à des erreurs et nécessite beaucoup de maintenance. Je ne l'utilise que lorsque je contrôle précisément les chaînes d'autoload.
  • Cache de fichiers (opcache.file_cache)Peut désamorcer les tâches CLI ou les redémarrages à court terme, car le bytecode se retrouve sur le disque. Pour les piles FPM first, je donne toutefois la priorité au cache de mémoire partagée ; le cache de fichiers est plutôt un complément pour les outils et les tâches cron.

Liste noire, sécurité et contrôle

Je supporte aussi ma configuration Opcache pour des raisons de sécurité et de stabilité propre :

  • opcache.restrict_api: Limite qui peut appeler les fonctions Opcache (par ex. Reset). Je définis ici un chemin d'accès où seuls les scripts admin sont présents.
  • opcache.blacklist_filename: exclure les fichiers/répertoires qui sont fréquemment réécrits (par ex. les générateurs de code) afin d'éviter le thrashing.
  • opcache.save_comments=1: Doit être actif, car les WP/Plugins misent souvent sur les Docblocks/annotations. Sans commentaires, les métadonnées sont perdues.
  • opcache.consistency_checksActiver uniquement en staging pour détecter les collisions de hachage ou les incohérences ; en production, cela coûte sensiblement en performance.
; Exemple
opcache.restrict_api=/var/www/html/opcache-admin
opcache.blacklist_filename=/etc/php/opcache-blacklist.txt
opcache.save_comments=1

Multi-site, plusieurs projets et pools PHP-FPM

Si plusieurs sites se partagent un pool de FPM, ils „se font concurrence“ pour le même Opcache. Je sépare donc projets nécessitant des ressources importantes dans leurs propres piscines :

  • Des valeurs INI propres à chaque pool ; je dimensionne ainsi memory_consumption exactement en fonction de la taille du site.
  • Pas d'éviction mutuelle de bytecode ; les mises à jour d'un site ne rincent pas le cache de l'autre.
  • Meilleure délimitation des erreurs : les redémarrages et le taux de réussite sont interprétables par application.

Dans les configurations multi-sites, j'observe en outre si certains sous-sites apportent un nombre extrêmement élevé de fichiers (Builder, WooCommerce, Page-Builder). J'adapte l'index des fichiers en conséquence et je prévois plus de mémoire tampon.

Maîtriser la fragmentation de la mémoire

Même si la mémoire totale est suffisante, une mémoire cache fragmentée peut soudainement Baisse des performances de l'environnement. J'observe donc

  • wasted_memory et opcache.max_wasted_percentageSi la valeur seuil est dépassée, Opcache redémarre. Si ces redémarrages s'accumulent, j'augmente la mémoire et je vérifie si certains déploiements modifient beaucoup de petits fichiers.
  • Mise en page du codeLes gros plug-ins qui sont fréquemment mis à jour provoquent davantage de fragmentation. Une fenêtre de release groupée au lieu de micro-mises à jour constantes aide.
  • Huge Code Pages (opcache.huge_code_pages) : Si le système supporte les grandes pages, cela peut réduire la fragmentation et les échecs TLB. Je ne le mets en place que si la plateforme est proprement configurée pour cela.

Flux de développement et de staging

En cours de développement Visibilité des modifications sur une performance maximale. Je travaille donc avec :

  • validate_timestamps=1 et revalidate_freq=0, Les modifications sont ainsi immédiatement visibles.
  • Fichiers INI séparés par environnement (DEV/Stage/Prod) pour éviter les prises en charge accidentelles.
  • JIT désactivé et enable_cli désactivé, afin que WP-CLI reste rapide et déterministe.
  • Désactiver systématiquement les extensions de débogage en production (par ex. Xdebug), car elles modifient fortement le comportement de la mise en cache et de l'exécution.

Dans les conteneurs, je fais attention au type de montage (par ex. Network/Bind-Mounts), car sinon les changements fréquents de timestamp déclenchent des revalidations inutiles.

Classer proprement les images d'erreur

Les symptômes typiques ont souvent des causes claires :

  • Soudain 500 après les mises à jour: Vérifier les redémarrages, la fragmentation et si le reload FPM a été déclenché exactement après le swap de code.
  • Frontends inconstants: validate_timestamps incorrect ou fenêtre de revalidation choisie trop grande.
  • Taux de succès durablement basIndex de fichier ou mémoire trop petite ; parfois, de nombreux „misses“ indiquent en outre des artefacts de construction en constante évolution.
  • Travaux CLI lents: enable_cli=0 est généralement correct ; un code optimisé ou le cache des fichiers, et non l'opcache SHM, peuvent aider.

Liste de contrôle rapide pour les 30 premières minutes

  • compter les fichiers PHP et max_accelerated_files avec 20-30 tampons %.
  • memory_consumption à 128-512 Mo selon la taille du site ; tampon de chaînes à 16-64 Mo.
  • validate_timestamps=1 et revalidate_freq à 60 en production.
  • Après le déploiement : rechargement du FPM, déclenchement des routes d'échauffement, puis vérification de opcache_get_status().
  • Observer les redémarrages, le taux de hit et wasted_memory ; en cas d'anomalies, procéder à un réajustement ciblé.
  • La sécurité : restrict_api mettre en place, save_comments=1 s'assurer que les chemins problématiques sont blacklistés si nécessaire.
  • En option : pools de FPM séparés pour les grands sites, afin que les caches ne se déplacent pas les uns les autres.

Dépannage avec système : des symptômes aux causes

Je lance la Analyse toujours avec des chiffres clés : Si le taux de hits diminue, si les redémarrages augmentent ou si les clés sont à la limite, j'en déduis des mesures ciblées. Si le cache est plein, j'augmente memory_consumption, si j'atteins la limite des fichiers, j'augmente max_accelerated_files. Si je vois des états de front-end contradictoires après des déploiements, je contrôle validate_timestamps et le moment d'un reload FPM. Si des 500 apparaissent sporadiquement, je vérifie les caches fragmentés et je consulte les journaux d'erreurs avant de modifier la configuration. Après chaque modification, je mesure à nouveau jusqu'à ce que les indicateurs et les temps de chargement soient cohérents.

Résumé succinct

Une forte WordPress-La performance commence par un Opcache suffisamment grand, des limites appropriées pour les fichiers accélérés et un tampon de chaînes internes judicieusement choisi. En production, je laisse les timestamps actifs, je cadence le contrôle et je définis des reloads contrôlés pour les versions afin que les modifications soient en ligne à temps. Je me fie à des métriques telles que le taux de réussite, les redémarrages et les clés, car elles me montrent objectivement quelle vis de réglage je dois tourner. Les valeurs d'un tableau sont des points de départ, mais c'est le monitoring qui décide de la manière dont je les adapte par site. En respectant cette discipline, on obtient de manière fiable des temps de réponse courts de PHP et le CPU reste détendu même en cas de pics de trafic.

Derniers articles