Maison > Article > développement back-end > Schéma de la relation entre CGI, FastCGI et PHP-FPM
Le contenu principal de cet article concerne le schéma de la relation entre CGI, FastCGI et PHP-FPM. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer.
Répertoire
Basique
Méthode module
CGI
Introduction à FastCGI
Une brève introduction à FastCGI
Comment FastCGI fonctionne
Introduction à PHP-FPM
Résumé
Références
Lors de la construction d'un serveur LAMP/LNMP, vous rencontrerez souvent les concepts de PHP-FPM, FastCGI et CGI. Si vous ne les connaissez que peu, il sera difficile de créer un serveur performant. Nous expliquerons ensuite graphiquement la relation entre ces concepts.
Dans toute l'architecture d'un site Web, le serveur Web (comme Apache) n'est que le distributeur de contenu. Par exemple, si le client demande index.html, le serveur Web trouvera ce fichier dans le système de fichiers et l'enverra au navigateur. Ce qui est distribué ici, ce sont des données statiques.
Si la requête est index.php, selon le fichier de configuration, le serveur Web sait qu'il ne s'agit pas d'un fichier statique et doit trouver un analyseur PHP pour le traiter , il traitera alors la demande. Traitez-la simplement, puis remettez-la à l'analyseur PHP.
Lorsque le serveur Web reçoit la requête index.php, il démarrera le programme CGI correspondant, qui est l'analyseur PHP. Ensuite, l'analyseur PHP analysera le fichier php.ini, initialisera l'environnement d'exécution, puis traitera la demande, renverra le résultat traité au format spécifié par CGI, quittera le processus et le serveur Web renverra le résultat au navigateur. Il s'agit d'un processus d'accès Web PHP dynamique complet. Il sera plus facile à comprendre si nous introduisons ensuite ces concepts,
CGI : Il est un protocole d'échange de données entre le serveur Web et l'application Web.
FastCGI : Identique à CGI, c'est un protocole de communication, mais il présente quelques optimisations en termes d'efficacité par rapport à CGI. De même, le protocole SCGI est similaire à FastCGI.
PHP-CGI : est le programme d'interface de PHP (Web Application) au protocole CGI fourni par Web Server.
PHP-FPM : est un programme d'interface pour le protocole FastCGI fourni par PHP (Web Application) au Serveur Web en complément. , il fournit également une gestion relative intelligente des tâches.
En WEB,
Serveur Web fait généralement référence à des serveurs tels qu'Apache, Nginx, IIS, Lighttpd, Tomcat, etc.,
L'application Web fait généralement référence à des applications telles que PHP, Java et Asp.net.
Avant de comprendre CGI, comprenons d'abord une autre méthode permettant au serveur Web de transférer des données : Méthode de chargement du module PHP. Prenons Apache comme exemple. En mode Module PHP, devez-vous ajouter les phrases suivantes au fichier de configuration d'Apache httpd.conf :
# 加入以下2句LoadModule php5_module D:/php/php5apache2_2.dllAddType application/x-httpd-php .php# 修改如下内容<IfModule dir_module> DirectoryIndex index.php index.html</IfModule>
Ce qui précède est la configuration manuelle après l'installation de php et de l'environnement Apache sous Windows. l'installation du code source sous Linux est grossièrement configurée comme ceci :
# ./configure --with-mysql=/usr/local --with-apache=/usr/local/apache --enable-track-vars
Donc, de cette façon, leur essence commune est d'utiliser LoadModule pour charger php5_module, c'est-à-dire utiliser php comme apache Un sous-module à exécuter . Lors de l'accès aux fichiers php via le Web, Apache appellera php5_module pour analyser le code php.
Alors, comment php5_module transmet-il les données à l'analyseur php pour analyser le code php ? La réponse passe par sapi.
Regardons une autre image pour parler en détail de la relation entre Apache, php et sapi :
De l'image ci-dessus, nous pouvons voir que sapi Il s'agit d'un tel processus intermédiaire. SAPI fournit une interface de communication externe, qui s'apparente un peu à un socket, permettant à PHP d'interagir avec d'autres applications (apache, nginx, etc.). PHP fournit de nombreux types de SAPI par défaut, les plus courants sont php5_module, CGI, FastCGI pour Apache et nginx, ISAPI pour IIS et Shell CLI.
Donc, le processus d'exécution de l'appel PHP ci-dessus est le suivant :
apache -> httpd -> php5_module -> sapi -> php
D'accord. Voyons Apache et PHP via php5_module !
Ce mode installe le module php dans Apache, donc chaque fois qu'Apache termine une requête, un processus sera généré, et ce processus inclura complètement divers calculs et calculs de php.
Dans l'image ci-dessus, nous pouvons clairement voir qu'à chaque fois qu'Apache reçoit une requête, un processus sera généré pour se connecter à php pour compléter la requête via sapi. Il est concevable que s'il y a trop d'utilisateurs, concurrent Si le nombre est trop élevé, le serveur ne pourra pas le supporter.
De plus, lorsque mod_php est compilé dans Apache, il est difficile de déterminer s'il s'agit d'un problème avec PHP ou Apache lorsqu'un problème survient.
CGI (Common Gateway Interface) le nom complet est "Common Gateway Interface", serveur WEB et PHP application Un outil pour "parler" dont le programme doit s'exécuter sur un serveur réseau. CGI peut être écrit dans n’importe quel langage à condition que celui-ci comporte des variables d’entrée, de sortie et d’environnement standard. Tels que php, perl, tcl, etc.
Quelles données le serveur WEB transmettra-t-il à l'analyseur PHP ? URL, chaîne de requête, données POST, en-tête HTTP seront tous là. Par conséquent, CGI est un protocole qui stipule quelles données doivent être transmises et dans quel format elles sont transmises au backend pour traiter la demande. Réfléchissez bien à la provenance des utilisateurs que vous utilisez dans votre code PHP.
En d’autres termes, CGI est spécialement utilisé pour gérer les serveurs Web. Lorsque le serveur Web reçoit une demande d'utilisateur, il soumettra la demande au programme cgi (tel que php-cgi). Le programme cgi traitera (analysera php) en fonction des paramètres soumis dans la demande, puis générera un code HTML standard. et renvoyez-la au serveur Web. Le serveur WEB la renvoie au client. C'est ainsi que fonctionne le cgi ordinaire.
L'avantage de CGI est qu'il est totalement indépendant de tout serveur et ne joue qu'un rôle d'intermédiaire. Fournit des interfaces pour Apache et PHP. Ils effectuent le transfert de données via le câblage CGI. L’avantage est de minimiser l’association entre les deux et de les rendre plus indépendants.
Mais il y a une chose gênante à propos de CGI, c'est-à-dire que chaque requête Web aura un processus de démarrage et de sortie, qui est le mode fork-and-execute le plus critiqué lors de l'échelle. de concurrence est élevé, ce sera une impasse.
Fondamentalement parlant, FastCGI est utilisé pour améliorer les performances des programmes CGI. Semblable à CGI, FastCGI peut également être considéré comme un protocole .
FastCGI est comme un CGI résident (longue vie) Il peut être exécuté à tout moment Tant qu'il est activé, il ne coûtera pas tout. il est temps de bifurquer une fois. Il prend également en charge l'informatique distribuée, c'est-à-dire que les programmes FastCGI peuvent être exécutés sur des hôtes autres que le serveur du site Web et accepter les demandes d'autres serveurs du site Web.
FastCGI est une extension ouverte CGI à architecture évolutive et indépendante du langage. Son comportement principal est de conserver le processus de l'interpréteur CGI en mémoire et ainsi d'obtenir des performances plus élevées. Comme nous le savons tous, le chargement répété de l'interpréteur CGI est la principale raison des faibles performances CGI. Si l'interpréteur CGI reste en mémoire et accepte la planification du gestionnaire de processus FastCGI, il peut offrir de bonnes performances, une évolutivité, des fonctionnalités de basculement, etc.
Le mode d'interface FastCGI adopte une structure C/S, qui peut séparer le serveur HTTP et le serveur d'analyse de script, et démarrer un ou plusieurs démons d'analyse de script sur le serveur d'analyse de script. Chaque fois que le serveur HTTP rencontre un programme dynamique, celui-ci peut être transmis directement au processus FastCGI pour exécution, puis le résultat est renvoyé au navigateur. Cette méthode permet au serveur HTTP de gérer exclusivement les requêtes statiques, ou de renvoyer les résultats du serveur de script dynamique au client, ce qui améliore considérablement les performances de l'ensemble du système d'application.
Charger le gestionnaire de processus FastCGI (Module Apache ou IIS ISAPI, etc.) au démarrage du serveur Web
Le gestionnaire de processus FastCGI s'initialise, démarre plusieurs processus interpréteurs CGI (plusieurs php-cgi peuvent être construits) et attend les connexions du serveur Web.
Lorsqu'une requête client atteint le serveur Web, le gestionnaire de processus FastCGI sélectionne et se connecte à un interpréteur CGI. Le serveur Web envoie des variables d'environnement CGI et des entrées standard au sous-processus FastCGI php-cgi.
Une fois le sous-processus FastCGI terminé, il renvoie la sortie standard et les informations d'erreur au serveur Web à partir de la même connexion. Lorsque le processus enfant FastCGI ferme la connexion, la demande est traitée. Le processus enfant FastCGI attend ensuite et gère la prochaine connexion à partir du gestionnaire de processus FastCGI (exécuté sur le serveur Web). En mode CGI, php-cgi se termine à ce stade.
Fonctionnalités de FastCGI et CGI :
Pour CGI, PHP doit réanalyser et recharger le php.ini pour chaque requête Web. Tous sont développés et toutes les structures de données sont réinitialisées. Avec FastCGI, tout cela ne se produit qu'une seule fois, lorsque le processus démarre. Un avantage supplémentaire est que les connexions persistantes aux bases de données fonctionnent.
Étant donné que FastCGI est multi-processus, il consomme plus de mémoire serveur que le multi-threading CGI. L'interpréteur php-cgi consomme 7 à 25 mégaoctets de mémoire par processus. Ou 100 est un très grand nombre de mémoire.
Pour comprendre PHP-FPM, il faut d'abord parler de PHP-CGI.
PHP-CGI est le gestionnaire FastCGI intégré implémenté par PHP. Bien qu'il s'agisse d'un produit officiel de PHP, il n'est pas puissant du tout, les performances sont trop médiocres, et il est également très gênant et impersonnel, cela se reflète principalement dans :
php-cgi change php. Après la configuration de l'ini, vous devez redémarrer php-cgi pour que le nouveau php-ini prenne effet, et un redémarrage en douceur n'est pas possible.
Tuez directement le processus php-cgi et php ne pourra pas s'exécuter.
Les deux problèmes ci-dessus dérangent de nombreuses personnes depuis longtemps, c'est pourquoi de nombreuses personnes utilisent encore la méthode Module. Ce n'est qu'en 2004 qu'un perdant nommé Andrei Nigmatulin a inventé PHP-FPM. L'émergence de cet artefact a complètement brisé cette situation. Il s'agit d'un gestionnaire Schéma de la relation entre CGI, FastCGI et PHP-FPM spécifique à PHP, il surmonte facilement les deux problèmes ci-dessus et s'est également montré plus puissant. performances dans d’autres domaines.
En d'autres termes, PHP-FPM est une implémentation spécifique du protocole FastCGI. Il est chargé de gérer un pool de processus pour gérer les requêtes du serveur web. Actuellement, après la version PHP5.3, PHP-FPM est intégré à PHP .
Parce que PHP-CGI n'est qu'un programme CGI, il ne peut qu'analyser les requêtes et renvoyer des résultats, mais ne sait pas comment gérer les processus. Par conséquent, certains programmes peuvent planifier le processus php-cgi, comme spawn-fcgi séparé de lighthttpd. De même, PHP-FPM est également un programme de gestion utilisé pour planifier et gérer l'analyseur PHP php-cgi.
PHP-FPM peut réaliser un redémarrage en douceur après une modification de php.ini en générant un nouveau sous-processus.
Enfin, résumons les problèmes que ces technologies peuvent résoudre grâce à une mise à niveau continue (sinon elles ne seraient pas mises à niveau).
Donc, si vous souhaitez créer un serveur WEB PHP hautes performances, le meilleur moyen actuellement est Apache/Nginx + Méthode FastCGI + PHP-FPM(+PHP-CGI), n'utilisez plus le chargement de module ni la méthode CGI :)
Les images de cet article ont été réalisées avec Visio, fichier source : php-fpm
Adresse originale : https://www.awaimai.com/371.html
Recommandations associées :
Analyse du noyau PHP7 1 CGI et FastCGI
Quelle est la relation entre CGI, FastCGI et PHP_FPM ?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!