php workers sont des processus autonomes qui exécutent du code PHP et traitent ainsi chaque requête dynamique d'un site web. Si trop de requêtes non mises en cache parviennent au serveur en même temps, les worker existants occupent tous les slots, une file d'attente se forme et le goulot d'étranglement entraîne des temps de réponse longs, TTFB-pics et erreurs.
Points centraux
Je résume les messages clés suivants de manière compacte, afin que tu puisses prendre rapidement les bonnes décisions pour Performance et la capacité.
- DéfinitionPHP Workers : les workers PHP traitent les requêtes en série, une seule requête à la fois par worker.
- BottleneckTrop peu de travailleurs créent des files d'attente, le TTFB augmente et les timeouts menacent.
- RessourcesLes workers ont besoin de cœurs de CPU ; un mauvais rapport provoque la commutation de contexte.
- Mise en cachePlus il y a de hits en provenance du cache, moins la charge du worker est importante lors des pics de trafic.
- Mise à l'échelle: adapter le nombre de travailleurs au profil de la page, aux plugins et aux interactions.
Que sont les PHP Workers dans le contexte de l'hébergement ?
Je comprends Travailleurs PHP comme des serveurs numériques qui servent chaque requête dynamique individuellement. Un worker lit le script PHP, déclenche des requêtes dans la base de données et construit le HTML pour le navigateur. Lorsqu'une tâche est en cours, le worker reste lié jusqu'à la fin et n'est à nouveau disponible qu'à ce moment-là, parallèle il ne travaille pas. Dans WordPress, les travailleurs se chargent en outre de tâches répétitives telles que les tâches Cron, l'envoi d'e-mails et les contrôles de sécurité. C'est précisément pour cette raison que le nombre et la qualité des travailleurs influencent la vitesse perçue d'une page web. site web massif.
Quand et pourquoi le goulot d'étranglement des travailleurs se produit-il ?
Un goulot d'étranglement se produit dès qu'il y a plus de demandes non mises en cache qui arrivent en même temps que de demandes non mises en cache. Travailleur sont disponibles. Chaque demande supplémentaire atterrit alors dans une file d'attente et attend qu'un créneau se libère. Cela augmente le Time To First Byte, prolonge les temps de chargement et peut faire échouer les processus de passage en caisse. Dans les boutiques ou les zones réservées aux membres, les contenus personnalisés aggravent la situation, car le cache ne peut pas fournir de nombreuses réponses, ce qui Dernier directement sur les travailleurs. Dans cette situation, j'obtiens le plus grand effet avec une mise en cache judicieuse, des plugins optimisés et un rapport Worker/CPU cohérent.
Reconnaître les symptômes : Lire correctement les métriques et les logs
Je regarde d'abord TTFBcar des valeurs croissantes indiquent des files d'attente. Les erreurs telles que 504 Gateway Timeout surviennent lorsque les demandes restent bloquées trop longtemps et s'interrompent brutalement. Dans le panneau d'hébergement, j'identifie les files d'attente par un nombre élevé de processus et une faible utilisation du réseau, ce qui est typique des requêtes bloquées. Travailleur est en cours. Les journaux d'accès montrent alors de nombreuses requêtes simultanées sur des chemins non mis en cache comme le panier d'achat, le checkout ou les tableaux de bord personnels. Si les temps de réponse augmentent en même temps dans le backend, les actions d'administration lourdes bloquent généralement certains travailleurs plus longtemps que prévu. nécessaire.
Délimitation importante : serveur web vs. PHP-FPM
Je fais une distinction claire entre les serveurs Web (par exemple NGINX/Apache) et les Noyau de travail PHP-FPM. Grâce à Keep-Alive et HTTP/2, le serveur web peut multiplexer de nombreuses connexions et servir des ressources statiques de manière extrêmement parallèle. Mais le véritable goulot d'étranglement se trouve dans PHP-FPM : chaque processus enfant y traite exactement une demande. Même si le navigateur ouvre des dizaines de requêtes en parallèle, le nombre de processus PHP limite le traitement simultané des chemins dynamiques. Cette distinction explique pourquoi les pages contenant de nombreux fichiers statiques semblent rapides, alors que certains points de terminaison dynamiques (Checkout, Login, API REST) s'accumulent malgré tout.
Nombre optimal de travailleurs : cœurs de calcul, RAM et profil d'application
Le nombre raisonnable de travailleurs dépend de la proportion de pages dynamiques, du paysage des plugins et des ressources disponibles. Noyaux du CPU à partir de. Je ne prévois jamais beaucoup plus de worker que de cœurs CPU, car le changement permanent de contexte augmente la latence. Pour les petits blogs, deux à quatre worker suffisent généralement, alors que les boutiques actives et les LMS en ont besoin de beaucoup plus. L'interaction reste décisive : plus de worker sans réserve de CPU n'apporte rien. Accélération. C'est pourquoi je teste en charge, je mesure le TTFB et je vérifie si la file d'attente disparaît avant de poursuivre la mise à niveau.
| Scénario | Non mis en cache | Travailleur | Noyaux du CPU | Effet | Action |
|---|---|---|---|---|---|
| Blog avec cache | Très faible | 2-4 | 2-4 | Livraison rapide | Gérer le cache, Plugins garder la ligne |
| WooCommerce avec des pointes | Moyenne-haute | 6-12 | 4-8 | Temps d'attente courts | Décharger le checkout, Travailleur augmentent |
| Membres/LMS | Haute | 8-16 | 8-16 | Moins de temps morts | Mise en cache de la personnalisation, CPU traîner |
| Application à forte composante API | Haute | 8-20 | 8-20 | TTFB plus uniforme | Optimiser les requêtes, Limites mettre |
Règles générales de dimensionnement
Pour une première impression, je calcule avec l'approximation simple : Travailleurs requis ≈ Requêtes simultanées non mises en cache. Cette simultanéité résulte de la fréquence des requêtes multipliée par le temps de traitement moyen. Exemple : 10 requêtes/s avec 300 ms de temps de service donnent environ 3 requêtes PHP simultanées. Si je prévois des marges de sécurité et des pics courts, je double cette valeur. Important : ce chiffre doit être converti en Noyaux du CPU et la RAM correspondent ; un worker sans temps CPU n'est qu'un autre en attente.
Calculer correctement le budget de stockage
Chaque processus PHP-FPM consomme de la RAM, en fonction de Version de PHP, actif Opcache et les plugins chargés. Je mesure l'empreinte réelle sous charge (ps/top) et je la multiplie par pm.max_childrenJ'ajoute le serveur web, la base de données et les services de cache. J'évite ainsi le swapping et le tueur d'OOM. En règle générale, je garde 20-30% de mémoire tampon RAM libre. Si la consommation par processus augmente nettement, j'interprète cela comme un signal pour Régime plug-in, moins d'extensions ou des paramètres memory_limit plus restrictifs par pool.
La mise en cache comme couche de décharge
Plus j'ai appris du Cache moins les travailleurs consomment d'énergie. Le cache de page, le cache d'objet et le cache de bordure réduisent considérablement l'exécution de PHP. J'encapsule les parties dynamiques comme le panier d'achat ou les blocs personnalisés avec ESI ou Ajax, afin que le reste reste en cache. Ceux qui veulent aller plus loin trouveront dans le Mise en cache côté serveur Guide des stratégies utiles pour NGINX et Apache, qui soulagent vraiment les travailleurs. Voici comment je peux réduire sensiblement le TTFB et maintenir la Temps de réaction faible en charge.
Je tiens également compte Validation du cache et des stratégies de préchauffage : Après des déploiements ou des modifications importantes de produits, je préchauffe les pages critiques et les routes API. Dans les boutiques, je charge les pages de catégories, les meilleures ventes, la page d'accueil et les préchargements de checkout afin d'amortir les pics de démarrage à froid. Pour le cache d'objets, je veille à ce que les stratégies de clés soient propres afin de ne pas rejeter inutilement les hotsets.
Erreurs typiques et pièges coûteux
Beaucoup soupçonnent d'abord un manque de RAM ou CPU comme problème principal, bien que la file d'attente des workers soit le véritable goulot d'étranglement. Je vérifie donc que les pages mises en cache restent rapides et que seuls les chemins dynamiques s'étendent. Une autre erreur consiste à dire que "plus de workers résout tout", ce qui, sans cœurs supplémentaires, se traduit par des changements de contexte élevés et une moins bonne latence. De même, les mauvais plugins lient un worker trop longtemps, ce qui augmente la latence ressentie. Performance se détériore. Je réduis donc les modules complémentaires, j'optimise les requêtes de base de données et je fais évoluer les ressources à l'unisson.
Zones sensibles spécifiques à WordPress
- admin-ajax.php et wp-jsonBeaucoup de petits appels s'additionnent et bloquent les travailleurs ; je regroupe les requêtes et mets en place des caches raisonnables.
- API HeartbeatDans le backend, je limite les fréquences afin de ne pas générer inutilement un grand nombre de requêtes simultanées.
- WooCommerce wc-ajax: les contrôles du panier d'achat, de l'expédition et des coupons sont souvent non mis en cache ; je réduis les appels externes à l'API et optimise les hooks.
- Transients et Options: Les options d'autoload surchargées ou les régénérations de transient coûteuses prolongent le temps d'exécution PHP et donc l'engagement des slots.
Pratique : De trois à huit travailleurs - sans embouteillage
Supposons qu'un magasin n'exploite que trois Travailleur et subit des embouteillages de check-out le soir. J'analyse d'abord les chemins qui ne sortent pas du cache et je mesure le TTFB sous charge. Ensuite, j'active une mise en cache propre des pages et des objets et je n'externalise que les zones personnalisées. Ensuite, j'augmente les workers à huit et j'ajoute en même temps deux Noyaux du CPU libre. Lors du test de charge suivant, les files d'attente diminuent et le taux d'erreur baisse considérablement.
En option, je lisse en outre les pics en fixant dans le serveur web des limites conservatrices pour les points finaux coûteux (par exemple, peu de flux montants simultanés pour le checkout), tandis que je livre les contenus statiques et mis en cache à une vitesse illimitée. Cela réduit la pression sur le pool de FPM et stabilise les TTFB en largeur, même si certaines actions des utilisateurs sont brièvement plus lentes.
Monitoring et tests de charge : les outils que j'utilise
Je suis TTFB, temps de réponse et taux d'erreur à intervalles courts, afin de voir les congestions à un stade précoce. Pour la charge synthétique, j'utilise des outils comme K6 ou Loader, car ils génèrent des pics réalistes. Les logs d'application aident à identifier les requêtes lentes et les appels d'API externes qui bloquent les travailleurs. En outre, je contrôle les pages d'état PHP-FPM afin de garder un œil sur les slots occupés, en attente et libres. Si les slots sont durablement pleins, j'augmente le nombre de travailleurs et de slots. CPU étape par étape, en vérifiant chaque étape avec une charge de test.
Interpréter les métriques en toute sécurité
- max children reached: La limite supérieure a été atteinte ; les requêtes attendent - il est temps d'augmenter le nombre de worker ou d'accélérer la mise en cache.
- listen queueUne file d'attente croissante confirme la congestion devant FPM ; je vérifie les paramètres du serveur web et du flux montant.
- request_slowlog_timeout et Slowlog : Identifie exactement les endroits de requêtes auxquels les travailleurs sont attachés.
- upstream_response_time dans les logs du serveur web : Indique combien de temps PHP a répondu ; je corrige avec request_time et les codes d'état (502/504).
Interpréter correctement les signaux concrets de mise à niveau
Si la TTFB augmente sensiblement malgré une mise en cache active, il manque généralement de la capacité de travail. Si les erreurs 504 s'accumulent lors d'actions telles que le checkout ou la connexion, il y a de véritables embouteillages. Un plus grand nombre de commandes simultanées, des campagnes spontanées ou des lancements justifient des worker supplémentaires pour que les transactions se déroulent correctement. Si le statut d'erreur 503 apparaît, il vaut la peine de consulter ce guide sur Erreur WordPress 503car les processus et les limites défectueux produisent des effets similaires. Ensuite, je décide si je veux utiliser Worker, CPU ou en augmentant les temps morts.
Configuration : PHP-FPM et limites raisonnables
Pour PHP-FPM, je détermine avec pm.max_children le nombre maximal de processus simultanés et donc la limite supérieure des travailleurs. Avec pm.start_servers et pm.min/max_spare_servers, je contrôle la vitesse à laquelle la capacité est disponible. pm.max_requests protège contre les fuites de mémoire en redémarrant les processus après X requêtes. request_terminate_timeout protège les longs runners afin qu'un worker ne reste pas bloqué indéfiniment et ne bloque pas des slots, ce que je définis soigneusement pour les chemins de checkout. Ces vis de réglage agissent directement sur les files d'attente, c'est pourquoi je ne les modifie qu'avec Tests.
Je choisis celui qui convient pm-Le mode "A" est un mode de vie : dynamique pour une charge fluctuante, ondemand pour une charge très sporadique sur de petites instances et static pour des pics élevés et constants, lorsque le CPU et la RAM sont clairement réservés. En outre, j'active Opcache avec suffisamment de mémoire et révise efficacement les scripts pour que les travailleurs utilisent moins de CPU par requête. Avec request_slowlog_timeout et slowlog je trouve des hotspots dans le code sans augmenter la taille du pool. Je vérifie si la socket FPM est utilisée comme Socle Unix ou TCP localement, je préfère les sockets, via les conteneurs/hôtes souvent TCP.
Liste de contrôle pour les boutiques, les adhésions et les LMS
Pour les boutiques, je considère que le dynamisme Pages comme le panier, le checkout et "Mon compte" et réduire les appels externes. Dans les espaces membres, je vérifie que chaque requête de profil et de tableau de bord ne comporte pas de requêtes superflues. Dans LMS, je mise sur le cache d'objets pour les listes de cours, tout en rendant efficacement les indicateurs de progression. Dans tous les cas, je vise un petit nombre de requêtes courtes par action, afin que les travailleurs soient rapidement à nouveau libres. Ce n'est que lorsque ces devoirs sont faits que j'élargis les workers et les CPU en parallèle.
Sessions, verrouillage et pièges de la concourance
Je fais attention aux verrous de session qui, en PHP, agissent par défaut en série par session utilisateur. Si des actions onéreuses (par exemple des appels de paiement) sont effectuées pendant la même session, cela bloque les autres requêtes de cet utilisateur - ce qui entraîne des pointes en TTFB et des ralentissements ressentis. Je minimise l'utilisation des sessions, je ne stocke que le strict nécessaire dans les sessions et je passe à des gestionnaires performants (par ex. en mémoire). Dans WooCommerce, je fais attention aux sessions et aux tempêtes transitoires dans le panier d'achat.
Base de données et services externes comme multiplicateurs
Souvent, les lenteurs captivent Requêtes SQL ou les limites de taux des API externes. J'optimise les index, je réduis les requêtes N+1, je mets en place des caches de requêtes (cache d'objets) et je limite les appels externes avec des délais d'attente et une logique de reprise. Si les serveurs de paiement, d'expédition ou de licences deviennent inertes, je limite volontairement le parallélisme sur ces routes afin que tout le pool n'attende pas. Il reste ainsi des créneaux libres pour d'autres actions des utilisateurs.
Choix du fournisseur et réglage de l'hébergement en fonction des travailleurs
Je préfère les plans d'hébergement où je peux Travailleurs PHP et d'étendre parallèlement les noyaux du processeur. Les fournisseurs performants fournissent des niveaux de mise en cache propres, un stockage NVMe rapide et des métriques claires dans le tableau de bord. Pour commencer l'évaluation technique, le Guide d'hébergement PHPqui met en évidence les critères et les options clés. Il est important pour moi que le soutien ne soit pas interrompu en cas de pic de trafic, mais que la capacité soit disponible sans redémarrage. Ainsi, je maintiens le TTFB, le taux d'erreur et le nombre d'utilisateurs. Débit en équilibre.
Plan pour les pics et protection contre la charge de bots
Je détermine à l'avance un chemin d'escalade : à quelle vitesse les travailleurs et les CPU qui surveille, quels sont les délais d'attente autorisés à croître temporairement ? Parallèlement, je minimise la charge des bots et des spams en fixant des limites de taux raisonnables sur les points d'accès dynamiques. Chaque demande inutile bloquée est un slot de travailleur resté libre pour les vrais clients.
A emporter
Travailleurs PHP décider de la rapidité de réaction des pages dynamiques sous la charge, car chaque processus ne traite qu'une seule demande à la fois. Je minimise la charge avec une mise en cache conséquente, je nettoie les plugins bloquants et j'établis un rapport raisonnable entre les travailleurs et l'unité centrale. En cas de pics, j'augmente prudemment le nombre de travailleurs et je teste si la file d'attente disparaît et si le TTFB baisse. Les logs, l'état de la FPM et les tests de charge me permettent de savoir si j'adapte correctement la taille ou si je dois affiner les délais. En maîtrisant ces leviers, on évite les goulets d'étranglement, on protège les transactions et on assure une accélération sensible de l'exécution. Expérience utilisateur.


