CGI et FastCGI sont deux protocoles non spécifiques à PHP :
-
CGI scripts est un moyen d'exécuter un scripts côté serveur (pas seulement PHP !) lorsqu'une requête HTTP arrive. Dans cette configuration, le serveur web lance un nouveau processus CGI pour chaque requête entrante, ce qui entraîne un surcoût de performance important.
-
FastCGI est un "meilleur CGI" - pour remédier aux limites des CGI, le FastCGI fonctionne comme un serveur (TCP ou UNIX), de sorte que les ressources peuvent être réutilisées entre les requêtes.
Le serveur Web compatible avec PHP peut être configuré comme suit :
-
mod_php est un module Apache permettant d'exécuter PHP. Dans cette configuration, les requêtes PHP sont traitées par le processus Apache avec tout ce qui va avec : Les processus PHP sont définis dans la configuration d'Apache, PHP s'exécute sous l'utilisateur et les permissions d'Apache, etc.
-
PHP-FPM est l'implémentation FastCGI de PHP. Dans cette configuration, PHP-FPM fonctionne comme un serveur FastCGI autonome et Apache s'y connecte en utilisant des modules FastCGI, tels que mod_fcgid
, mod_fastcgi
o mod_proxy_fcgi
(Apache 2.4+). Dans cette configuration, les permissions, les processus et tout le reste sont contrôlés par le serveur PHP-FPM. Les performances sont comparables à mod_php
.
-
SuPHP - ce était utilisé pour remédier à certaines lacunes de mod_php
liés aux permissions : avec mod_php
Les scripts de PHP sont exécutés sous l'utilisateur/groupe Apache, mais mod_suphp
peut exécuter les scripts sous un autre utilisateur. suPHP n'est plus maintenu et ne devrait pas être utilisé.
-
CGI/FastCGI - J'ai ajouté celui-ci suite à une question dans les commentaires. Sans connaître les détails de la configuration, PHP peut être exécuté comme serveur FastCGI en utilisant n'importe quelle autre implémentation FastCGI - comme expliqué dans une autre question . Je n'utilise pas cette configuration et ne vois aucun avantage par rapport à PHP-FPM.
-
CGI - PHP peut aussi être exécuté en tant que bon vieux CGI script, mais je ne peux pas imaginer un seul cas d'utilisation valable pour cela, à part la compatibilité avec certains environnements très dépassés.
En ce qui concerne les avantages et les inconvénients de ces différentes approches, je me limite à mod_php
et PHP-FPM, couvrant deux cas d'utilisation principaux :
-
mod_php
peut être utile dans certaines configurations Docker où vous souhaitez fournir un seul conteneur exécutant un serveur web PHP. Le fait que tout fonctionne comme un seul processus facilite la configuration du conteneur Docker. D'autre part, l'exécution du serveur PHP-FPM dans un seul conteneur avec un serveur web nécessiterait une orchestration des processus, soit avec supervisord Il s'agit d'une approche qui va à l'encontre des meilleures pratiques en matière d'écriture de conteneurs Docker.
-
PHP-FPM est une approche plus puissante qui sépare mieux les préoccupations, de sorte que le serveur PHP-FPM peut être configuré, (performant) et maintenu séparément du serveur web. Cela permet également d'exécuter le serveur PHP-FPM dans un pool ou sur une machine différente du serveur web. Comme il a été dit plus haut, pour les conteneurs Docker, il est recommandé d'utiliser des conteneurs PHP-FPM et de serveur web séparés, ce qui rend la configuration plus complexe (et plus puissante). L'approche de PHP-FPM est aussi la seule façon de faire avec nginx car le module PHP correspondant n'existe pas.
Ma mise en œuvre Docker des deux approches susmentionnées peut être consultée ici :
La mise en œuvre est conçue pour fonctionner avec certains de mes anciens et nouveaux projets dans mon cluster Kubernetes. N'hésitez pas à l'utiliser.
Donc, TLDR :
- CGI et FastCGI sont des protocoles ; CGI est lent, FastCGI est beaucoup plus rapide.
-
mod_php
et PHP-FPM sont les deux principaux moyens d'exécuter PHP.
-
mod_SuPHP
est une approche qui a été utilisée pour aborder mod_php
des lacunes. Il est obsolète et PHP-FPM devrait être utilisé à la place.