...

WordPress et PHP Max Input Vars - Cause silencieuse d'erreurs et de performances

De nombreuses erreurs dans WordPress ont une cause silencieuse : le réglage php max input vars wordpress. Je montre comment cette valeur limite coupe les réglages, enregistre les formulaires de manière incomplète et freine les performances - et comment définir correctement cette valeur.

Points centraux

Pour commencer, je vais résumer brièvement les aspects les plus importants afin que tu puisses rapidement voir où tu dois commencer.

  • Valeur limite: Max Input Vars détermine le nombre de variables que PHP accepte par requête.
  • Symptômes: options de thème manquantes, formulaires tronqués, erreurs de plugin.
  • Hébergement: les valeurs maîtres et les modules de sécurité peuvent prendre le pas sur les réglages locaux.
  • Optimisation: adapter soigneusement php.ini, .htaccess ou .user.ini.
  • Valeurs indicatives: 3000 au minimum, 5000-10000 pour les grandes configurations (source [1], [4]).

Qu'est-ce que PHP Max Input Vars - et pourquoi cela concerne-t-il WordPress ?

Le paramètre max_input_vars limite le nombre de variables POST et GET que PHP traite dans une seule requête et sert ainsi de protection contre les formulaires surdimensionnés et les flots de configuration. Dans une installation WordPress typique, les options des panneaux de thème, des customiseurs, des widgets, des menus, des paramètres de plug-in et des champs de formulaire s'additionnent rapidement pour atteindre plusieurs centaines d'entrées, ce qui conduit à des données tronquées si la limite est trop petite. Ce sont surtout les constructeurs de pages, les plug-ins de commerce électronique et les formulaires à plusieurs niveaux qui font grimper le nombre, c'est pourquoi je fixe une valeur de départ de 3000 et que j'envisage 5000 à 10000 pour les configurations luxuriantes (source [1], [4]). Ceux qui souhaitent en plus utiliser d'autres Limites PHP trop stricte aggrave la situation, car plusieurs vis de réglage freinent alors simultanément. Il est important de l'utiliser en connaissance de cause : une valeur trop basse entraîne des pertes de données silencieuses, une valeur raisonnablement plus élevée crée au contraire une situation d'urgence. Stabilité.

Erreurs typiques dans WordPress en cas de limite trop basse

Un premier signal d'alarme est l'enregistrement incomplet de Options du thèmeJe clique sur Enregistrer, mais seule une partie des paramètres est conservée, tandis que d'autres semblent “revenir en arrière”. Les grands formulaires sont tout aussi critiques : certains champs manquent sans laisser de trace, car PHP rejette les variables surnuméraires et les commandes, les inscriptions ou les demandes d'assistance arrivent ainsi incomplètes. Dans les menus comportant de nombreuses entrées, les modifications ou le tri disparaissent, ce que les exploitants attribuent souvent par erreur aux plugins. Les constructeurs de pages perdent les paramètres des modules ou des widgets, bien que l'éditeur fonctionne correctement, ce qui rend l'analyse des causes plus difficile. Lorsque je vois de tels symptômes regroupés, je vérifie immédiatement la valeur de max_input_vars, J'ai besoin d'un peu de temps avant de modifier les plugins ou les thèmes.

Limites d'hébergement, valeurs maîtres et modules de sécurité

Même si j'augmente les valeurs localement, un serveur étendu peut Valeur maître par le fournisseur d'accès, ce qui est particulièrement fréquent sur les hébergements partagés. Scénario typique : je définis 5000 dans mon php.ini, mais le serveur n'accepte que 1000 parce qu'une limite globale s'applique et ignore les adaptations locales. Des modules de sécurité supplémentaires comme Suhosin introduisent leurs propres limites d'entrée, que je dois ensuite augmenter séparément, sinon ils continuent à bloquer les champs excédentaires malgré des max_input_vars corrects. C'est pourquoi, pour les cas persistants, je commence par demander à l'hébergeur de me confirmer la valeur maître effective et de me nommer les modules possibles. Ce n'est qu'une fois cette chaîne proprement configurée que les modifications locales sont vraiment efficaces en continu.

Diagnostic : comment trouver rapidement le goulot d'étranglement

En cas de suspicion, j'ouvre d'abord Statut du site web-dans WordPress-Admin et vérifie la valeur réellement active de max_input_vars, idéalement complétée par phpinfo() dans un fichier test. Si mes modifications diffèrent de la valeur affichée, soit une valeur maître bloque, soit j'ai manipulé la mauvaise instance (par exemple un mauvais gestionnaire PHP ou un mauvais répertoire). Je teste un menu avec beaucoup d'entrées ou un long formulaire et j'observe s'il manque des entrées, ce qui confirme le goulot d'étranglement. Parallèlement, je veille à vider le cache des objets ou des pages ainsi que l'OPCache, sinon les anciennes configurations restent visibles. Il est également utile de jeter un coup d'œil sur le Limite de mémoire PHP, Les formulaires et les interfaces de construction de grande taille sont gourmands en mémoire et constituent une limite à l'interaction avec d'autres éléments. Effets peut déclencher.

Configuration dans la pratique : quatre moyens fiables

Je procède de manière pragmatique pour l'adaptation : Je demande d'abord à l'hébergeur et je fais débloquer l'augmentation côté serveur, car c'est la méthode la moins sujette aux erreurs et qui prend directement en compte les valeurs du maître. Avec un accès root ou managed, j'édite le php.ini, je définis une valeur claire (environ 5000) et je redémarre le service PHP pour que la modification soit active. Sur les systèmes Apache, je peux travailler dans le .htaccess, à condition que mod_php soit en cours d'exécution, et si Suhosin est actif, je peux augmenter ses valeurs limites à cet effet. Sans accès au php.ini central, j'utilise un .user.ini dans le webroot, ce qui fonctionne de manière fiable dans de nombreux environnements gérés. Ensuite, je vérifie la modification dans WordPress et avec phpinfo() ; ce n'est que lorsque les deux sont compatibles que je teste les sauvegardes des menus, des formulaires et de la base de données. Options.

; php.ini
max_input_vars = 5000
# .htaccess (uniquement avec mod_php)

  php_value max_input_vars 5000
  # Facultatif pour Suhosin :
  php_value suhosin.request.max_vars 5000
  php_value suhosin.post.max_vars 5000
; .user.ini
max_input_vars = 7000

Choisir des valeurs : Quelle est la valeur raisonnable ?

Je démarre rarement sous 3000, car les interfaces d'administration modernes envoient déjà beaucoup de variables dans le fonctionnement de base (source [1]). Pour les sites avec Page Builder, de nombreux widgets, des menus spécifiques à la langue ou des panels de plugins étendus, je fixe 5000 comme valeur indicative utilisable au quotidien (source [4]). Pour les grandes boutiques WooCommerce avec des produits variables, des filtres et des formulaires de checkout complexes, je prévois 7000 à 10000 afin de laisser une marge de croissance. Il est important de tester progressivement : après chaque augmentation, je vérifie les points problématiques afin de ne pas viser trop haut, mais de m'assurer que les erreurs disparaissent. L'objectif est une valeur qui porte aujourd'hui et qui laisse des réserves pour demain, sans augmenter inutilement d'autres limites. se promènent.

Interactions avec les plugins et les thèmes

Je note que les plug-ins de cache ou de performance ont leurs propres .htaccess-C'est pourquoi je vérifie à nouveau les directives actives après avoir modifié de tels outils. Les constructeurs de pages avec des modules imbriqués augmentent fortement la variance, en particulier lorsque des options globales et spécifiques à la page sont combinées. Les générateurs de menus ou les outils d'importation envoient de nombreux champs en une seule fois, ce qui entraîne immédiatement des données tronquées lorsque les limites sont serrées. Je vérifie brièvement les effets, surtout après les mises à jour des plug-ins, car les nouvelles fonctions peuvent apporter des paramètres supplémentaires. Ceux qui se plaignent de grandes structures de navigation trouveront de plus amples informations à ce sujet sous Performance des menus, car les menus sont de véritables Pilote de variable.

Performance et sécurité : le bon équilibre

Une limite plus élevée signifie que PHP est plus Variables ce qui peut signifier plus de données par requête, mais ne conduit pas automatiquement à des pics de charge. La situation ne devient critique que lorsque des formulaires comportant des milliers de champs sont traités régulièrement et sollicitent donc davantage la mémoire et le processeur. C'est pourquoi je combine l'augmentation de max_input_vars avec un regard sur le temps d'exécution, la taille de l'entrée et la limite de la mémoire, afin que l'ensemble du système reste cohérent. Du point de vue de la sécurité, la valeur limite est utile car elle permet de limiter les requêtes erronées ou délibérément surchargées ; la protection du fournisseur d'accès, le WAF et les limites de débit permettent de maintenir un niveau de sécurité à ce niveau. Je choisis donc une valeur qui couvre les exigences réelles, sans pour autant maximiser aveuglément chaque limite. large.

Scénario Variables typiques max_input_vars Remarque
Petit site (blog, portfolio) 200-800 3000 Une réserve suffisante pour les mises à jour de thèmes (source [1])
Site multilingue avec Builder 800-2500 5000 Beaucoup de panneaux et de menus (source [4])
WooCommerce avec variantes 2000-6000 7000-10000 Marge de manœuvre pour le checkout et les options de produits (source [1], [4])
Formulaires d'entreprise/CRM 5000+ 10000+ Coordination étroite avec l'hébergeur, monitoring utiliser

Dépannage : les modifications n'ont pas d'effet - que faire ?

Si rien ne change malgré l'adaptation, je vérifie d'abord l'état actif de l'ordinateur. Gestionnaire PHP (mod_php, FPM, CGI), car un mauvais contexte rend les fichiers locaux inefficaces. Ensuite, je compare phpinfo() avec WordPress-Site-Health pour exclure les caches et voir les valeurs effectives. Si la valeur reste obstinément basse, il existe presque toujours une valeur maître chez le fournisseur d'accès, que je fais confirmer par écrit et augmenter. Pour les configurations FPM, je dois éventuellement configurer le pool correct ou recharger le service, sinon l'ancienne valeur reste active. Si Suhosin continue à bloquer, j'augmente son request.max_vars et son post.max_vars jusqu'à ce que les Nombre de formulaires passe en toute sécurité.

Exemples pratiques et valeurs de référence qui portent

Pour une installation de blog avec un thème standard et quelques plugins, je mets 3000, Je teste les menus et les options du thème et je m'en tiens généralement là. Pour un site d'entreprise avec des méga-menus, des contenus multilingues et un constructeur de pages, je démarre directement à 5000, ce qui, dans la pratique, apporte un calme appréciable. Un système de boutique plus important avec des variantes et des champs supplémentaires démarre à 7000 et augmente si nécessaire jusqu'à 10000, afin que les importations de produits, les adaptations du checkout et les panneaux d'administration fonctionnent correctement. Ce qui compte, c'est moins la valeur absolue que le rapport avec la taille réelle des formulaires et des panneaux, c'est pourquoi je consigne les modifications et observe les pics de charge. Il en résulte un réglage qui est durablement fiable et permet une mise à l'échelle ultérieure.

Comment les variables PHP comptent vraiment - et pourquoi les builders atteignent si vite leurs limites

Important pour la pratique : Chaque champ de formulaire correspond à au moins une variable dans $_POST ou $_GET. WordPress utilise souvent pour les panneaux complexes Syntaxe du tableau avec des parenthèses, comme option[group][sous-groupe][champ]. PHP construit des tableaux imbriqués à partir de ces éléments - et chaque feuille dans cette structure compte contre max_input_vars. Les champs répétitifs, les listes dynamiques, les méga-menus et les variantes de traduction font gonfler le nombre particulièrement rapidement. A cela s'ajoutent Champs cachés (par ex. nonces, IDs) et des paramètres systémiques que les opérateurs négligent facilement. Cela explique pourquoi un formulaire avec „seulement“ 300 entrées visibles peut générer 1000+ variables en interne.

Sont particulièrement concernés

  • Éditeurs de menus (chaque point de menu apporte plusieurs champs et métadonnées)
  • Constructeur de pages avec des widgets imbriqués, des options globales et des options de page
  • Panneaux d'options de thèmes/plugins qui transmettent des arborescences de configuration entières
  • Configurations multilingues, pour lesquelles des champs sont dupliqués par langue

Important : max_input_vars limite le nombre de variables - pas les Taille totale de la demande. Pour les limites de taille sont post_max_size et upload_max_filesize est responsable. Les deux doivent correspondre à l'augmentation choisie, afin que les requêtes ne s'interrompent pas ailleurs.

Les architectures de serveur en vue : Apache, NGINX, FPM, conteneurs

La question de savoir si et où une modification est efficace dépend fortement de l'architecture. Un bref aperçu qui permet d'abréger de nombreuses recherches d'erreurs :

  • Apache avec mod_php: .htaccess peut php_value mettre en place. S'applique immédiatement, mais uniquement dans ce contexte.
  • Apache + PHP-FPM (proxy_fcgi): .htaccess ignore php_value. Les modifications sont effectuées dans php.ini, .user.ini ou dans le Pool FPM.
  • NGINX + PHP-FPM: Aucun .htaccess-fichiers de données. Configuration via php.ini, .user.ini ou pool FPM ; NGINX lui-même ne connaît pas cette valeur.
  • Conteneur/géré: modifications souvent par option du tableau de bord, variable d'environnement ou montage du fichier ini. Après les mises à jour/déploiements, vérifier si les valeurs persistent.

Dans les environnements FPM, je me sécurise en modifiant directement la valeur dans le piscine et de recharger le service :

; /etc/php/8.2/fpm/pool.d/www.conf
php_admin_value[max_input_vars] = 7000
; Ensuite : systemctl reload php8.2-fpm (ou recharger le service de manière appropriée)

Pour .user.ini est valable : les modifications ne sont pas toujours actives immédiatement. Selon les user_ini.cache_ttl il faut plusieurs minutes pour que les nouvelles valeurs soient visibles. Je prévois donc un temps d'attente ou un rechargement FPM. Signal d'erreur : WordPress continue à signaler l'ancienne valeur, bien que le fichier se trouve correctement - c'est alors que le TTL du cache intervient ou qu'une valeur maître bloque.

Important : Définir php_value seulement en .htaccess, si mod_php est active. Dans les configurations FPM, cela déclenche généralement des erreurs 500 parce que le serveur web ne comprend pas la directive.

Mesurer au lieu de deviner : Compter les variables en direct et simuler les goulots d'étranglement

Avant d'augmenter la valeur „par suspicion“, je mesure les besoins réels. Une courte aide au diagnostic sous forme de code temporaire dans un plugin "must use" ou functions.php écrit le comptage dans le log :

<?php
// Avertissement : à n'utiliser que temporairement et à supprimer ensuite.
add_action('admin_init', function () {
  if (!empty($_POST)) {
    // Comptage récursif de toutes les valeurs de la feuille
    $count = 0 ;
    $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($_POST)) ;
    foreach ($it as $v) { $count++ ; }
    error_log('POST vars (recursive) : ' . $count) ;
    error_log('max_input_vars (ini) : ' . ini_get('max_input_vars')) ;
  }
}) ;

Je vois ainsi immédiatement si un processus d'enregistrement atteint sa limite. En outre, je teste avec un „formulaire de stress“ (par exemple, des champs factices générés) pour vérifier qu'aucun champ ne disparaît après une augmentation. Important : vider les caches pour que le backend n'affiche pas encore d'anciens états.

les cas spéciaux : Multisite, API REST, Ajax et téléchargements

À l'adresse suivante : Multisite-Les paramètres réseau, les options basées sur les rôles et les entrées spécifiques à la langue s'accumulent très rapidement. Ici, je planifie dès le départ avec des valeurs plus élevées et je vérifie par sous-réseau, car les panels peuvent être très différents.

Toutes les fonctions de WordPress ne sont pas affectées de la même manière : API REST-envoient souvent du JSON dans le corps de la requête, qui n'est pas défini en tant que $_POST est analysé ; max_input_vars ne s'applique pas dans ce cas. En revanche, les admin-ajax.php-(formulaires POST) sont clairement liées à la limite. Ceux qui utilisent des builders qui enregistrent via Ajax doivent donc tout de même garder un œil sur la limite.

Défini pour les téléchargements de fichiers max_file_uploads le nombre maximal de fichiers simultanés, tandis que upload_max_filesize et post_max_size qui fixent des limites de taille. Si les téléchargements dépassent ces valeurs, des erreurs surviennent indépendamment de max_input_vars. Dans les environnements restrictifs, les limites du serveur web ou du WAF (par ex. les limites du corps de la requête) peuvent également intervenir - une raison typique pour des requêtes „soudainement“ interrompues malgré des valeurs PHP correctement définies.

Prévention des erreurs au niveau du code : quand l'augmentation ne suffit pas

Du point de vue du développeur, il est souvent utile de regrouper les grandes configurations en Tronçons de les diviser ou de les enregistrer pas à pas. Les modèles suivants réduisent le flot de variables :

  • Pagination/Steps: diviser les longs formulaires en étapes et les enregistrer par étape côté serveur.
  • Chunking: diviser les grands tableaux d'options en blocs et les transmettre les uns après les autres par Ajax.
  • Sauvegarde différentielleEnvoyer uniquement les champs modifiés au lieu de l'arbre d'options complet.
  • Stockage en série: au lieu de nombreux champs individuels, utiliser une option structurée avec sérialisation (limite le nombre de variables lors de l'envoi).

Ces modèles réduisent les dépendances à l'égard max_input_vars et rendent les opérations d'administration plus robustes, notamment dans les environnements où les limites des fournisseurs sont strictes.

Meilleures pratiques et liste de contrôle pour les opérations courantes

  • Mesurer avant l'augmentation: consigner le nombre de variables lors d'actions critiques (enregistrer le menu, sauvegarder la page du builder).
  • Augmenter par étapes: Augmenter par étapes raisonnables (3000 → 5000 → 7000) et tester après chaque étape.
  • Vérifier l'architecture: vérifier les gestionnaires (mod_php/FPM/CGI) et utiliser le chemin approprié (php.ini, .user.ini, pool FPM).
  • Confirmer la valeur maîtreDemander au fournisseur d'accès la valeur limite globale et la documenter.
  • Synchroniser les modules de sécurité: Augmenter en parallèle les limites de Suhosin et les limites comparables.
  • Versionner la configuration: inclure les fichiers ini/pool dans les processus de déploiement pour que les mises à jour ne réinitialisent pas les valeurs.
  • Vider les caches: invalider le cache des objets, le cache des pages et le cache OPC après des modifications.
  • Les limites de taille en vue: post_max_size, upload_max_filesize, max_file_uploads, max_execution_time et memory_limit de manière appropriée.
  • Mettre en place un suivi: vérifier les logs pour voir s'il y a des sauvegardes „tronquées“ récurrentes et des erreurs d'admin.

Des scénarios de test pratiques qui révèlent rapidement les problèmes cachés

Dans les audits, je fais trois tests rapides : 1) enregistrer un menu volumineux avec tri ; 2) dupliquer et réenregistrer une page Builder avec de nombreux widgets/repeaters ; 3) envoyer un long formulaire avec des champs optionnels/cachés. Si l'une des étapes incohérent est max_input_vars un candidat chaud. Ce n'est que lorsque les trois scénarios fonctionneront de manière fiable que mes adaptations seront considérées comme résilientes - même en cas de croissance.

En bref

Le réglage max_input_vars agit comme un gardien de porte pour tous les champs entrants et décide souvent si WordPress enregistre proprement ou avale secrètement des données. Avec 3000 comme limite inférieure et 5000-10000 pour les configurations riches en données (source [1], [4]), je crée la marge de manœuvre nécessaire et élimine les images d'erreur mystérieuses. Je vérifie chaque étape avec WordPress-Site-Health et phpinfo() afin d'identifier clairement les valeurs principales, les caches ainsi que les modules de sécurité. Ce n'est que lorsque les limites du fournisseur, les fichiers locaux et l'instance PHP active sont compatibles que les adaptations fonctionnent de manière fiable. En respectant cette chaîne, on évite les pannes, on réduit les frais d'assistance et on maintient la qualité de la base de données. Performance du site est constamment élevé.

Derniers articles