Comprendre PHP-FPM et ses Configurations Clés

Ce document sert de journal d'apprentissage et de référence.

Introduction aux interfaces PHP : CLI, CGI, FastCGI et PHP-FPM

PHP en ligne de commande (CLI)

L'interface de ligne de commande (CLI) permet d'exécuter des scripts PHP directement depuis le terminal. Le cycle de vie du script PHP se termine avec l'exécution du script. Bien que pratique pour les développeurs, le mode CLI est rarement utilisé pour des applications web complexes en raison de limitations dans la gestion des paramètres POST, le téléchargement de fichiers et l'absence d'interface utilisateur.

CGI (Common Gateway Interface)

Le CGI est un standard définissant l'interface entre un serveur web et des applications externes. Il s'agit essentiellement d'un protocole permettant au serveur web de transmettre des requêtes à un programme externe (programme CGI) et de recevoir les résultats. Pour chaque requête entrante, le serveur web démarre une nouvelle instance de l'interpréteur PHP (en tant que programme CGI), traite la requête, puis termine le processus. Ce modèle, souvent appelé "fork-execute-kill", est simple mais inefficace pour un trafic élevé, car la création et la destruction répétées de processus consomment beaucoup de ressources.

FastCGI

FastCGI est une évolution du protocole CGI visant à améliorer l'efficacité. Ses principaux avantages résident dans la pré-initialisation des processus et leur maintien en mémoire. Contrairement au CGI traditionnel, FastCGI maintient des processus PHP en vie après avoir traité une requête, les rendant disponibles pour les requêtes suivantes. Cela réduit considérablement la surcharge liée à la création de nouveaux processus. Cependant, la gestion de multiples processus FastCGI nécessite un orchestrateur pour éviter les problèmes de concurrence ("coup de poing des cohortes"), rôle assumé par PHP-FPM.

Avantages de FastCGI : haute efficacité opérationnelle.

Inconvénient : la nature multi-processus peut entraîner une consommation mémoire plus importante par rapport à une approche multi-thread.

PHP-CGI

PHP-CGI est une implémentation du protocole CGI pour PHP. C'est l'interpréteur PHP utilisé dans le mode CGI. Avant PHP 5.3, il était largement utilisé, mais il a depuis été largement remplacé par PHP-FPM pour les environnements de production. Le processus typique de PHP-CGI implique l'initialisation des variables PHP, le lancement de la machine virtuelle Zend, le chargement et l'analyse de php.ini, l'exécution du script PHP (analyse lexicale/syntaxique, compilation en opcodes, exécution), et enfin le retour des résultats au serveur web.

PHP-FPM (FastCGI Process Manager)

PHP-FPM est un gestionnaire de processus pour PHP qui implémente le protocole FastCGI. Contrairement au mode CGI où le serveur web contrôle directement le démarrage des processus PHP, avec FastCGI et PHP-FPM, la gestion des processus est déléguée à PHP-FPM. Le serveur web transmet les requêtes à PHP-FPM, qui les distribue ensuite aux processus PHP-CGI disponibles sous son contrôle. Étant donné que chaque processus PHP-FPM ne peut traiter qu'une seule requête utilisateur à la fois, une configuration appropriée du nombre de processus est cruciale pour optimiser les performances du serveur.

Configuration de PHP-FPM (php-fpm.conf)

Le fichier php-fpm.conf (ou souvent des fichiers dans php-fpm.d/) permet de gérer le comportement de PHP-FPM, notamment le nombre de processus enfants.

Gestion des processus enfants (pm)

Le paramètre pm détermine la stratégie de gestion des processus :

  • static : Maintient un nombre fixe de processus enfents (défini par pm.max_children). Offre les meilleures performances mais peut consommer beaucoup de mémoire si le nombre est trop élevé, nécessitant potentiellement des redémarrages fréquents pour libérer la mémoire.
  • dynamic : Ajuste dynamiquement le nombre de processus en fonction de la charge. Il garantit toujours au moins un processus enfant. Les paramètres suivants sont importants :
    • pm.max_children : Nombre maximum d'enfants pouvant être actifs simultanément.
    • pm.start_servers : Nombre d'enfants créés au démarrage.
    • pm.min_spare_servers : Nombre minimum d'enfants inactifs. Si le nombre d'inactifs tombe en dessous de cette valeur, de nouveaux processus sont créés.
    • pm.max_spare_servers : Nombre maximum d'enfants inactifs. Si le nombre d'inactifs dépasse cette valeur, certains processus sont terminés.
  • ondemand : Aucun processus n'est créé au démarrage. Des processus sont générés à la demande lors de nouvelles connexions. Les paramètres pertinents sont :
    • pm.max_children : Nombre maximum d'enfants actifs.
    • pm.process_idle_timeout : Délai en secondes après lequel un processus inactif est terminé.

Exemple de configuration :


pm = dynamic

; Nombre maximal d'enfants PHP-FPM.
; Une estimation courante est 20-30 Mo par processus.
pm.max_children = 256

; Nombre d'enfants créés au démarrage.
pm.start_servers = 40

; Nombre minimum d'enfants inactifs.
pm.min_spare_servers = 20

; Nombre maximum d'enfants inactifs.
pm.max_spare_servers = 60
   

Lors de la configuration de pm.max_children, il est conseillé de considérer qu'un processus PHP-FPM consomme environ 20 à 30 Mo de mémoire. Avec pm = static, un nombre excessif de processus peut saturer la mémoire du serveur.

Activation de la page de statut PHP-FPM

PHP-FPM offre une page de statut intégrée qui fournit des informations précieuses sur son état actuel. Pour l'activer, modifiez le fichier de configuration.

Configuration dans php-fpm.conf :


; Chemin d'accès pour la page de statut. La valeur par défaut est commentée.
pm.status_path = /status
   

Étapes pour configurer la page de statut :

  1. Décommentez et configurez pm.status_path dans php-fpm.conf, puis redémarrez PHP-FPM.

  2. Ajoutez une configuration dans le fichier de configuration Nginx de votre site pour gérer ce chemin. Redémarrez ensuite Nginx. ```

    location = /status { fastcgi_pass 127.0.0.1:9000; # Ou l'adresse de votre socket PHP-FPM fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }

  3. Accédez à http://votresite.com/status dans votre navigateur pour visualiser la page de statut. Des paramètres optionnels peuvent être ajoutés :

    • /status?json : Renvoie les données au format JSON.
    • /status?html : Renvoie les données au format HTML (par défaut).
    • /status?xml : Renvoie les données au format XML.
    • /status?full : Affiche des informations détaillées sur tous les processus enfants.

Exemple de sortie de la page de statut :


pool:                 www
process manager:      static
start time:           01/Jul/2011:17:53:49 +0200
start since:          62636
accepted conn:        190460
listen queue:         0
max listen queue:     1
listen queue len:     42
idle processes:       4
active processes:     11
total processes:      15
max active processes: 12  ; Nombre maximum de processus actifs depuis le démarrage de FPM. Utile comme référence pour pm.max_children.
max children reached: 0
   

Étiquettes: php-fpm CGI FastCGI Configuration performance

Publié le 9 juillet à 20h12