...

Chargement automatique de WordPress : Pourquoi wp_options freine ton site

Chargement automatique de WordPress charge à chaque appel de page un grand nombre d'options du tableau wp_options dans la mémoire et fait ainsi grimper le TTFB, le CPU et la RAM. Si trop de données autoloaded s'accumulent ici, c'est justement cette table qui ralentit sensiblement ta page.

Points centraux

Je vais résumer les faits les plus importants afin que tu puisses évaluer immédiatement si les options autoloaded te ralentissent. À chaque requête, WordPress charge toutes les entrées avec autoload=yes, qu'elles soient utilisées ou non. Cela agit comme un sac à dos invisible qui s'alourdit à chaque plug-in installé. À partir d'une taille d'autoload d'environ 1 Mo, les performances chutent rapidement, ce qui est particulièrement frappant sur les petits hôtes. En suivant quelques étapes ciblées, je réduis durablement la charge et maintiens la wp_options propre.

  • Charge de l'autoload: Tout ce qui a autoload=yes arrive en mémoire à chaque appel de page.
  • Taille critique: à partir de ~1 MB, le TTFB augmente fortement ; 2-3 MB sont considérés comme une zone d'alerte.
  • Principal moteur: plugins, transients, logs et cron jobs défectueux.
  • Mesure: SQL/WP-CLI montre immédiatement la taille et les principaux responsables.
  • remède: nettoyer, autoload sur „no“, externaliser, vérifier régulièrement.

Pourquoi Autoload freine

Les options d'autoload se retrouvent en mémoire à chaque requête, indépendamment du fait que la page en ait besoin ou non ; c'est précisément ce qui consomme de la mémoire. Ressources. Les petites valeurs se remarquent à peine, mais pour de nombreux plug-ins, la somme atteint rapidement des centaines de kilo-octets, voire plusieurs méga-octets. À partir d'environ 1 Mo, je constate régulièrement une augmentation du TTFB, des pages admin plus lentes et des pics de CPU plus nombreux. Sur les hébergements partagés, la charge se multiplie car les requêtes parallèles base de données wordpress une charge supplémentaire. Plus le bloc d'autoload est grand, plus la désérialisation est longue et plus ton serveur perd de temps avant le premier octet.

Comment WordPress charge en interne (alloptions et cache d'objets)

WordPress regroupe toutes les options autoloaded en un grand bloc. Lors de la première requête, ce bloc est chargé avec une seule requête et placé sous la clé collective alloptions sont stockées dans le cache des objets. Cela réduit certes le nombre de requêtes dans la base de données, mais pas la quantité de données à traiter : Le bloc entier doit être désérialisé et conservé en mémoire. Avec un Cache d'objets persistants (par exemple Redis ou Memcached), la charge de la base de données disparaît, mais les processus PHP doivent continuer à décompresser les données et à les maintenir en RAM. Cela signifie qu'un gros bloc d'autoload est nuisible même si les données proviennent du cache - seul le goulot d'étranglement se déplace de la base de données vers le CPU et la mémoire vive.

C'est particulièrement critique dans les cas suivants

  • un parallélisme élevé (beaucoup de requêtes simultanées) : Chaque ouvrier PHP charge le bloc séparément.
  • des temps de traitement courts (FPM/Serverless) : L'overhead s'applique à nouveau à chaque nouveau processus.
  • Zone d'administration et Cron: Les caches sont plus souvent contournés ou invalidés, le bloc d'autoload compte à chaque fois.

Comment trouver les plus grands coupables d'autoload

Je commence par une mesure de taille directement dans la wp_options. Je récupère le montant par SQL : SELECT SUM(LENGTH(option_value)) AS autoload_size FROM wp_options WHERE autoload = 'yes' ;. Les valeurs supérieures à 1 Mo sont critiques, à partir de 2-3 Mo, cela devient dangereux, surtout pour le trafic. Ensuite, je trie par taille : SELECT nom_option, LENGTH(valeur_option) AS bytes FROM wp_options WHERE autoload = 'yes' ORDER BY bytes DESC LIMIT 20 ;. J'identifie ainsi les grands tableaux, les anciens Transients et des entrées de plugins qui, souvent, n'ont même pas besoin d'être autoloadées ; une brève Instructions pas à pas aide à évaluer les résultats en toute sécurité.

Diagnostic avancé : compter, regrouper, reconnaître des modèles

Pour approfondir, je vérifie non seulement la taille totale, mais aussi le nombre et l'origine des entrées :

  • Nombre d'options autoloadées: SELECT COUNT(*) FROM wp_options WHERE autoload='yes' ;
  • Top espaces de noms (heuristique via les préfixes) : SELECT SUBSTRING_INDEX(nom_option,'_',1) AS ns, COUNT(*) AS cnt, SUM(LENGTH(option_value)) AS bytes FROM wp_options WHERE autoload='yes' GROUP BY ns ORDER BY bytes DESC LIMIT 10 ;
  • Transients faussement autoloadés: SELECT nom_option FROM wp_options WHERE autoload='yes' AND nom_option LIKE '_transient_%' ESCAPE '' ;

Ces requêtes me permettent de trouver rapidement, par exemple, des caches de statistiques, des artefacts de constructeurs de pages ou des restes de logs. Les modèles sont souvent clairement reconnaissables : plusieurs milliers de petites entrées d'un plugin Analytics ou quelques très grands tableaux d'un builder.

Valeurs limites et mesures

Pour une évaluation rapide, j'utilise des seuils fixes et j'en déduis les prochaines étapes. Étapes à partir de. Je prends ainsi des décisions sans perdre de temps avec mes tripes. Le tableau aide à classer et donne des options d'action claires par domaine. Je m'y tiens, car il fonctionne de manière fiable dans de nombreux projets. C'est justement lorsque les ressources sont limitées qu'il apporte un plus. Clarté en moins d'une minute.

Taille de l'autochargeur Risque Mesure recommandée
0-500 KO faible Documenter le statut, vérifier de temps en temps
500 KO-1 MO moyen Vérifier les entrées les plus importantes, supprimer les entrées inutiles
> 1 MO élevé Identifier le principal responsable, drapeau Autoload sur „no“.“
> 2-3 MO critique Nettoyage systématique, suppression des transitoires

Nettoyer en toute sécurité : étape par étape

Avant chaque modification, je sauvegarde la base de données, car une sauvegarde complète me protège contre Erreurs. Avec WP-CLI, c'est rapide : wp db export. Je supprime les transitoires expirés : wp transient delete --expired et seulement si nécessaire, tous : wp transient delete --all. Je supprime les options de plugin orphelines de manière ciblée, par exemple avec wp option delete my_plugin_option. Pour les grandes entrées qui n'ont pas besoin d'être autoloadées, j'applique le drapeau : wp option update option_name 'value' --autoload=no; ensuite, je vérifie le frontend et le Backend minutieux.

Filet de sécurité, tests et retour en arrière

Après chaque modification, je vérifie ces domaines dans cet ordre : la page d'accueil (en tant qu'invité), une sous-page profonde, la connexion/déconnexion, le tableau de bord d'administration et la sauvegarde d'un message. En outre, je déclenche Cron : wp cron event run --due-now et je consulte le journal des erreurs. Si quelque chose se casse, je réinitialise de manière ciblée : wp option update option_name 'value' --autoload=yes ou je règle la sauvegarde. Pour les grands tableaux, j'exporte au préalable leur contenu avec wp option get option_name > backup.json, Je peux donc le restaurer à tout moment.

Ce que je ne mets pas sur „autoload=no

WordPress utilise certaines options extrêmement tôt dans le bootstrap ou lors de chaque traitement de requête. Je ne modifie pas aveuglément leur indicateur de chargement automatique, même s'il est important :

  • siteurl, home: URLs de base, requises tôt.
  • permalink_structure, rewrite_rules: Essentielles pour la résolution des requêtes ; ne sont pas incluses dans alloptions, des résultats de base de données supplémentaires suivent.
  • template, stylesheet: Détermination du thème.
  • blog_charset, timezone_string et d'autres défauts de base.

Règle de base : je laisse autoloader les options de base et celles qui sont utilisées sur presque toutes les requêtes. Je me concentre sur les grandes entrées de plugins rarement utilisées, les artefacts de cache, les logs et les anciens transients.

Quand les options doivent rester grandes

Certaines données peuvent être volumineuses, mais elles ne doivent pas être stockées en mémoire à chaque requête. atterrissent. Pour les configurations étendues, j'utilise mes propres tableaux au lieu de wp_options ; cela permet de limiter la quantité d'autoload. Les informations relatives à l'utilisateur doivent être placées dans la méta utilisateur et non dans les options globales. J'enregistre les contenus statiques comme les longues chaînes CSS/JS dans un fichier et je les charge de manière ciblée. Lors de l'enregistrement, je règle l'autoload directement sur „no“, par exemple avec la commande add_option('name', $data, '', 'no') ;, pour éviter les Chargement d'éviter.

Guide du développeur : Des modèles qui évoluent

En tant que développeur, j'évite les énormes „méga-options“ qui rassemblent tout dans un tableau. Mieux vaut un ensemble de base étroit (autoload=yes) plus des lazy loads ciblés (autoload=no). Des schémas pratiques :

  • Fractionner les options: mon_plugin_core (petit, autoload=yes) et my_plugin_cache_* (grand, autoload=no).
  • Mise en cache ciblée: sous-ensembles fréquemment utilisés avec wp_cache_set() mettre en mémoire tampon au lieu de laisser de grandes options se charger automatiquement.
  • Utiliser correctement les transitoires: Par défaut, ne pas sauvegarder et rappeler consciemment les transitions autoloaded ; seulement les très petites transitions courantes autoloaded.
  • Stopper la croissance des options: ne pas placer de logs ou de caches non démarrés dans les options ; forcer la taille maximale et le TTL.

Prévenir plutôt que réparer

Je garde mes plugins légers et je désactive ce qui n'a pas d'utilité claire ; il reste donc le bloc Autoload petit. Une fois par mois, je contrôle la taille avec SQL ou WP-CLI et je documente les valeurs. Sous Outils > État du site, je surveille les indications sur les options chargées automatiquement. Pour les sites très visités, il vaut la peine d'utiliser un hébergement qui base de données wordpress de manière efficace et en gardant wp_options propre. Un recueil de bonnes pratiques Stratégies de tuning m'aide à détecter les problèmes à un stade précoce et à éviter qu'ils ne prennent de l'ampleur.

Automatisation : Petits boulots, grands effets

Je prévois un nettoyage régulier. Un job cron nocturne (ou un cron serveur qui exécute WP-CLI) supprime les transients expirés et consigne la taille de l'autoload dans un fichier ou un tableau. Je peux ainsi voir les tendances avant que les utilisateurs ne les ressentent. Exemple de procédure (simplifiée) :

wp transient delete --expired
wp db query "SELECT NOW(), SUM(LENGTH(option_value)) FROM wp_options WHERE autoload='yes' ;" >> autoload_stats.log

Il est confortable de disposer d'un petit Health-Check qui enregistre les entrées du top 10 avec la date. Un coup d'œil dans le journal suffit pour attribuer les valeurs aberrantes à une période donnée - généralement après une mise à jour du plugin ou une nouvelle fonction.

Exemple pratique : 60 minutes de nettoyage

Dans un projet, j'ai trouvé 5 500 options autoloadées avec environ 2 Mo au total ; la page a fourni le premier octet après environ 1.900 ms. Après la sauvegarde, la suppression des transitoires, la vérification du top 20 et les ajustements des drapeaux, le temps de chargement a diminué de moitié pour atteindre environ 500 ms. L'utilisation du processeur est passée de 89 % à environ 2,5 %, et le backend a réagi beaucoup plus rapidement. La procédure était simple : mesurer, nettoyer, tester, documenter. C'est exactement la routine que j'utilise régulièrement pour suivre la croissance des wp_options contrôler durablement.

Causes typiques et corrections

Les constructeurs de pages aiment écrire de grands tableaux de cache dans des options que je préfère dans des fichiers. dépôt. J'enregistre les statistiques sous forme de transients non chargés automatiquement et je les appelle de manière ciblée. Les logs doivent être placés dans des fichiers rotatifs et non dans wp_options. Les jobs Cron qui échouent provoquent d'anciens transients ; j'adapte ici les intervalles et les délais d'attente. Grâce à ces simples modifications, la quantité d'autoload diminue rapidement et reste stable à long terme. stable.

Influence des caches, de la FPC et de l'hébergement

Un Full-Page-Cache (FPC) placé en amont protège en premier lieu les visiteurs anonymes. Mais partout où le cache est contourné - utilisateurs connectés, panier d'achat, checkout, admin, cron, WP-CLI - le bloc d'autoload se fait sentir pleinement. Un serveur de base de données rapide dissimule la charge I/O, mais le temps CPU pour la désérialisation et la consommation de RAM restent. C'est justement sur les petites instances avec peu de travailleurs FPM qu'un gros bloc d'autoload entraîne des files d'attente et des dépassements de temps, bien que les données „sortent du cache“. L'objectif est donc toujours le même : garder le bloc lui-même petit, et pas seulement rendre la source plus rapide.

Suivi et indicateurs

Je trace le TTFB, le First Contentful Paint et le temps de chargement du backend avant et après chaque Nettoyage. En parallèle, je documente la taille de l'autoload, le nombre d'options autoloadées et les plus grandes entrées. Une petite feuille avec la date, la taille et le TTFB suffit pour obtenir des tendances claires. Pour l'entretien, j'utilise chaque mois les requêtes SQL et une brève description des données. Gérer la base de données-liste de contrôle. Cela me permet de repérer rapidement les dérives et de maintenir les base de données wordpress durablement mince.

Le multisite : Deux chantiers en vue

Dans les configurations multisite, il y a une charge d'autoload à la fois par site et au niveau du réseau. Je vérifie donc les wp_options de chaque site (préfixe de tableau par blog) et en plus les options de réseau. Les grands tableaux utilisés globalement ont un impact sur tous les sites. Procéder comme dans le cas d'une configuration unique : mesurer, identifier les entrées les plus importantes, externaliser les grandes valeurs ou les mettre sur autoload=non s'ils ne sont pas utilisés sur chaque requête. Une réduction se fait immédiatement sentir, en particulier dans l'administration réseau.

Les malentendus les plus fréquents - brièvement clarifiés

  • „Redis résout le problème“.“ Il réduit les requêtes DB, mais pas la taille du bloc d'autoload. Les coûts de CPU et de RAM restent.
  • „FPC rend Autoload indifférent“.“ Pas pour les utilisateurs connectés, Cron et Admin. L'avantage FPC n'y est pas applicable.
  • „Supprimer tous les transitoires est dangereux“.“ C'est sans danger, ne mène qu'à une nouvelle construction. Utiliser de manière ciblée et planifiée.
  • „Un gros bloc, ça va, s'il y a peu d'entrées“.“ Ce qui compte, c'est la somme des octets et la désérialisation, et non le nombre seul.

Plan de test après le nettoyage

  • Frontend: page d'accueil, page d'archives et de détails aléatoires, en tant qu'invité et utilisateur connecté.
  • Fonctions: recherche, formulaire de contact, panier/checkout (si boutique).
  • Admin: tableau de bord, liste des contributions, enregistrement d'une contribution/d'un produit, page de plugin.
  • Contexte: Exécuter les événements Cron planifiés, vérifier le journal des erreurs, mesurer le TTFB de manière aléatoire.

Résumé pour des décisions rapides

Les options d'autoload sont un tueur silencieux de performances que je peux éliminer en quelques étapes claires. capturer. Je mesure la taille, je supprime les anciens transitoires, je règle les entrées inutiles sur autoload=no et je stocke les données volumineuses. Ensuite, je teste le frontend et le backend et je note les points de mesure. Avec une heure de travail de focalisation, je réduis souvent la charge de l'autoload de 30 à 70 % et je divise par deux les temps de chargement. En répétant cette routine tous les mois, on maintient wp_options rapide et la page sensiblement réactive.

Derniers articles