À propos des cinq modes de fonctionnement courants de PHP :
1) CGI (Common Gateway Interface)
2) FastCGI (CGI résident/CGI longue durée)
3) CLI (exécution de ligne de commande/interface de ligne de commande)
4) Mode module Web (serveurs Web tels que le mode d'exécution Apache)
5) ISAPI (Internet Server Application Program Interface)
Remarque : Après PHP5.3, PHP n'a plus de mode ISAPI, et il n'y a plus de php5isapi.dll après l'installation de ce fichier. Pour utiliser une version supérieure de PHP sur IIS6, vous devez installer l'extension FastCGI, puis activer IIS6 pour prendre en charge FastCGI.
1.1. Mode CGI
CGI est l'interface de passerelle commune. C'est un programme En termes simples, CGI est comme un pont qui relie les pages Web aux connectés. le programme d'exécution dans le serveur Web, il transmet les instructions reçues par HTML au programme d'exécution du serveur, puis renvoie les résultats du programme d'exécution du serveur à la page HTML. CGI est extrêmement multiplateforme et peut être implémenté sur presque tous les systèmes d'exploitation. CGI est déjà un modèle plus ancien et a rarement été utilisé ces dernières années.
Chaque fois qu'il y a une demande d'utilisateur, un sous-processus CGI sera d'abord créé, puis la demande sera traitée et le sous-processus sera terminé après le traitement. Il s'agit du Fork-And-Execute. mode. Lorsque le nombre de requêtes utilisateur est très important, une grande quantité de ressources système telles que la mémoire, le temps CPU, etc. sera occupée, ce qui entraînera de faibles performances. Par conséquent, un serveur utilisant CGI aura autant de sous-processus CGI qu'il y a de demandes de connexion. Le chargement répété de sous-processus est la principale raison des faibles performances CGI.
Si vous ne souhaitez pas intégrer PHP dans un logiciel côté serveur (tel qu'Apache) et l'installer en tant que module, vous pouvez choisir de l'installer en mode CGI. Ou utilisez PHP avec différents wrappers CGI pour créer des environnements chroot et setuid sécurisés pour votre code. De cette façon, chaque client demande un fichier PHP, et le serveur Web appelle php.exe (php.exe sous win, php sous Linux) pour interpréter le fichier, puis renvoie le résultat de l'interprétation au client sous la forme de une page Internet. Cette méthode d'installation installe généralement le fichier exécutable PHP dans le répertoire cgi-bin du serveur Web. La recommandation CERT CA-96.11 recommande de ne placer aucun interpréteur dans le répertoire cgi-bin. L'avantage de cette méthode est qu'elle sépare le serveur Web du traitement spécifique du programme, qu'elle a une structure claire et une forte contrôlabilité. En même temps, l'inconvénient est que s'il y a une forte demande d'accès, le processus CGI deviendra un énorme. charge du serveur. , imaginez que des centaines de requêtes simultanées amènent le serveur à bifurquer des centaines de processus et vous comprendrez. C'est pourquoi CGI a toujours été connu pour ses faibles performances et sa consommation élevée de ressources.
1.2, mode FastCGI
FastCGI est une version améliorée de FastCGI est comme un CGI longue durée, qui peut toujours pendant l'exécution, aussi longtemps. comme il est activé, il ne faudra pas de temps pour effectuer un Fork à chaque fois (c'est le mode fork-and-execute le plus critiqué de CGI).
FastCGI est une interface de communication évolutive et à haut débit entre les serveurs HTTP et les langages de script dynamiques. Les serveurs HTTP les plus populaires prennent en charge FastCGI, notamment Apache, Nginx et lighttpd. Dans le même temps, FastCGI est également pris en charge par de nombreux langages de script, notamment PHP.
Le mode d'interface FastCGI adopte la 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 traiter 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.
[Principe]
1) Le gestionnaire de processus FastCGI (IIS ISAPI ou Apache Module) est chargé au démarrage du serveur Web
2) Le gestionnaire de processus FastCGI s'initialise ; , Démarrez plusieurs processus interpréteurs CGI (visibles plusieurs php-cgi.exe ou php-cig) et attendez les connexions du serveur Web
3) Lorsque la requête du client atteint le serveur Web, le gestionnaire de processus FastCGI sélectionne et connectez-vous à un interpréteur CGI. Le serveur Web envoie les variables d'environnement CGI et l'entrée standard au sous-processus FastCGI php-cgi
4) Une fois le traitement terminé, le sous-processus FastCGI 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 et gère ensuite la prochaine connexion du gestionnaire de processus FastCGI (exécuté dans WebServer). En mode CGI normal, php-cgi.exe se ferme ici.
En mode CGI, vous pouvez imaginer à quel point le CGI est généralement lent. Chaque requête Web adressée à PHP doit réanalyser le php.ini, recharger toutes les extensions dll et réinitialiser toutes les structures de donné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.
Remarque : le gestionnaire de processus FastCGI de PHP est PHP-FPM (PHP-FastCGI Process Manager)
[Avantages]
1) Du point de vue de la stabilité, FastCGI utilise un pool de processus indépendant pour exécuter CGI. Si un seul processus meurt, le système peut facilement le supprimer, puis réaffecter un nouveau processus pour exécuter la logique ; 2) Du point de vue de la sécurité, FastCGI prend en charge l'informatique distribuée. FastCGI est complètement indépendant du serveur hôte. Quelle que soit la manière dont FastCGI tombe en panne, il ne fera pas tomber le serveur
3) D'un point de vue performances, FastCGI sépare le traitement de la logique dynamique du serveur ; Le traitement des E/S à forte charge est toujours laissé au serveur hôte, afin que le serveur hôte puisse se concentrer sur les E/S. Pour une page Web dynamique ordinaire, il ne peut y avoir qu'une petite partie du traitement logique et un grand nombre d'images statiques. comme des images.
【Inconvénients】
Après avoir parlé des avantages, parlons des inconvénients. D'après mon utilisation actuelle, le mode FastCGI est plus adapté aux serveurs dans les environnements de production. Mais il ne convient pas aux machines de développement. Parce que lorsque vous utilisez Zend Studio pour déboguer le programme, FastCGI pensera que le processus PHP a expiré et renverra une erreur 500 sur la page. C'était tellement ennuyeux que je suis revenu en mode ISAPI sur ma machine de développement. La prise en charge des nouvelles versions de certains serveurs n'est pas bonne et une installation modulaire ne nécessitant pas d'équilibrage de charge distribué est un meilleur choix. La communication actuelle entre FastCGI et le serveur n'est pas assez intelligente. Si un processus FastCGI prend trop de temps à s'exécuter, il sera arrêté et redémarré comme un processus mort. Cela est très gênant lors du traitement de tâches à long terme. pour permettre le débogage en ligne. Parce qu'il est multi-processus, il consomme plus de mémoire serveur que le multithreading CGI. L'interpréteur PHP-CGI consomme 7 à 25 mégaoctets de mémoire par processus. Multiplier ce nombre par 50 ou 100 représente une grande quantité de mémoire.
PHP-CLI est l'abréviation de PHP Command Line Interface Comme son nom l'indique, c'est l'interface sur laquelle PHP peut s'exécuter. la ligne de commande. Différent de l'environnement PHP (PHP-CGI, ISAPI, etc.) exécuté sur le serveur Web. En d’autres termes, PHP peut non seulement écrire des pages Web frontales, mais il peut également être utilisé pour écrire des programmes back-end. PHP CLI Shell Scripting s'applique à tous les avantages de PHP, permettant la création de scripts ou de systèmes côté serveur ou même avec des applications GUI. Le mode PHP-CLI est pris en charge sous Windows et Linux.
[Avantages]
1) En utilisant plusieurs processus, une fois le processus enfant terminé, le noyau sera responsable du recyclage des ressources
2) En utilisant plusieurs processus ; , le processus enfant sera anormal. La sortie n'entraînera pas la fermeture du processus entier et le processus parent aura toujours la possibilité de reconstruire le processus
3) Un processus principal résident est uniquement responsable de la distribution des tâches ; , et la logique est plus claire.
Nous utilisons souvent "php -m" sous Linux pour savoir quelles extensions PHP a installées, qui est le mode d'exécution de la ligne de commande PHP ; les étudiants intéressés peuvent saisir "php -h" pour étudier ce mode d'exécution en profondeur ; .
Le mode module est intégré sous la forme du module mod_php5 À l'heure actuelle, la fonction du module mod_php5 est de recevoir les requêtes de fichiers PHP. transmis par Apache. Et traitez ces requêtes, puis renvoyez les résultats traités à Apache. Si nous configurons le module PHP
(mod_php5) dans son fichier de configuration avant le démarrage d'Apache, le module PHP enregistre le hook ap_hook_post_config d'apache2 et démarre ce module lorsque Apache commence à accepter les requêtes PHP.
En plus de cette méthode de chargement au démarrage, les modules Apache peuvent être chargés dynamiquement au moment de l'exécution, ce qui signifie que le serveur peut être étendu sans avoir à recompiler le code source, voire pas du tout. pour arrêter le serveur. Il suffit d'envoyer le signal HUP ou AP_SIG_GRACEFUL au serveur pour notifier au serveur de recharger le module. Mais avant le chargement dynamique, nous devons compiler le module dans une bibliothèque de liens dynamiques. Le chargement dynamique à ce moment consiste à charger la bibliothèque de liens dynamiques. Le traitement des bibliothèques de liens dynamiques dans Apache est effectué via le module mod_so, donc le module mod_so ne peut pas être chargé dynamiquement, il ne peut être compilé que statiquement dans le noyau d'Apache. Cela signifie qu'il est démarré avec Apache.
Comment Apache charge-t-il les modules ? Prenons comme exemple le module mod_php5 mentionné précédemment. Nous devons d'abord ajouter une ligne au fichier de configuration d'Apache httpd.conf :
LoadModule php5_module modules/mod_php5.so
Ce mode de fonctionnement est ce que nous utilisons souvent lors de l'utilisation du serveur Apache dans l'environnement Windows. Dans la modularisation (DLL), PHP est démarré et exécuté avec le serveur Web. (C'est une extension d'Apache basée sur CGI pour accélérer l'efficacité opérationnelle de PHP).
ISAPI (Internet Server Application Program Interface) est un ensemble d'interfaces API pour les services Internet fournis par Microsoft. Une DLL ISAPI peut résider en mémoire après avoir été activée par une demande d'utilisateur, en attente d'une autre demande d'utilisateur, et peut également être utilisée. Dans Plusieurs fonctions de traitement des demandes des utilisateurs sont configurées dans une seule DLL. De plus, l'application ISAPI DLL et le serveur WWW sont dans le même processus et l'efficacité est nettement supérieure à celle de CGI. (En raison de l'exclusivité de Microsoft, il ne peut fonctionner que dans l'environnement Windows) PHP est un module Apache Une fois que le serveur Apache démarre le système, il pré-génère plusieurs copies de processus et réside dans la mémoire. Une fois qu'une requête se produit, ces sous-processus inactifs sont immédiatement utilisés pour le traitement, de sorte qu'il n'y a aucun retard causé par la génération de sous-processus. Ces copies du serveur ne se ferment pas immédiatement après le traitement d'une requête HTTP, mais restent sur l'ordinateur en attendant la requête suivante. La réponse aux requêtes du navigateur client est plus rapide et les performances sont plus élevées. Site Web PHP chinois, il existe de nombreux tutoriels d'introduction PHP gratuits, tout le monde est invité à apprendre ! Cet article est reproduit à partir de : https://www.jianshu.com/p/e9eef6dc7d67