Maison >développement back-end >Problème PHP >PHP a plusieurs modes d'exécution
À propos des cinq modes de fonctionnement courants de PHP :
(1) CGI (Common Gateway Interface)
(2 ) FastCGI (Resident CGI/Long-Live CGI)
(3) CLI (Command Line Run/Command Line Interface)
(4) Mode module Web (le mode dans lequel les serveurs Web tels comme Apache exécuté)
(5) ISAPI (Internet Server Application Program Interface)
Remarque : Après PHP5.3, PHP n'a plus de mode ISAPI, et il n'existe plus après l'installation. il y a le fichier php5isapi.dll. 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. Mode CGI
CGI est la Common Gateway Interface (Common Gateway Interface). En termes simples, CGI est comme un pont qui connecte. pages Web à Connecté au programme d'exécution du 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. C'est le Fork-. Mode Et-Exécution. 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 (comme 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.
Recommandations associées : "Tutoriel d'introduction à PHP"
2 Mode FastCGI
FastCGI est une mise à niveau de Version CGI, FastCGI est comme un CGI de longue durée. Il peut être exécuté à tout moment, tant qu'il est activé, il ne faudra pas de temps pour se lancer à chaque fois (c'est le mode fork-and-execution le plus critiqué).
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) Charger le gestionnaire de processus FastCGI (IIS ISAPI ou Apache Module) au démarrage du serveur Web
(2) ) Le gestionnaire de processus FastCGI s'initialise, démarre plusieurs processus interpréteurs CGI (visibles plusieurs php-cgi.exe ou php-cig) et attend les connexions du serveur Web
(3) Lorsque le client demande En atteignant le Web Server, le gestionnaire de processus FastCGI sélectionne et se connecte à 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 Web ; Serveur à 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, au démarrage du processus. 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é Regardez , FastCGI utilise un pool de processus indépendant pour exécuter CGI. Si un seul processus meurt, le système peut facilement le supprimer et réaffecter un nouveau processus pour exécuter la logique
(2) Du point de vue de la sécurité, FastCGI prend en charge la distribution ; informatique. 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 ; il est préférable de le laisser au serveur hôte, afin que le serveur hôte puisse se concentrer sur les IO pour un Web dynamique ordinaire. page, il peut y avoir seulement une petite partie du traitement logique et une grande quantité de traitement statique tel que les 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 nouvelle version de certains serveurs n'a pas un bon support. Une installation modulaire qui ne nécessite pas d'équilibrage de charge distribué est-elle 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 permettant à PHP d'exécuter. sur la ligne de commande. , distinct 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.
(1) En utilisant plusieurs processus, une fois le processus enfant terminé, le noyau sera responsable du recyclage des ressources
(2 ) En utilisant plusieurs processus, la sortie anormale du processus enfant ne provoquera pas la fermeture de l'ensemble du processus Thread, et le processus parent aura la possibilité de reconstruire le processus (3) Un résident ; le processus principal est uniquement responsable de la répartition 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 ; .4. Mode module
Le mode module est intégré sous la forme du module mod_php5 A ce moment, la fonction du module mod_php5 est de recevoir la requête de fichier PHP transmise. par Apache et le traiter. Ces requêtes sont ensuite traitées et les résultats renvoyé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 de fichiers PHP.
En plus de cette méthode de chargement au démarrage, les modules d'Apache peuvent être chargés dynamiquement au moment de l'exécution, ce qui signifie que le serveur peut être étendu sans avoir besoin de recompiler le code source, voire sans arrêter du tout 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.soNous utilisons ici la commande LoadModule. Le premier paramètre de la commande est le nom du module. Le nom se trouve dans le source. code de l'implémentation du module. La deuxième option est le chemin où se trouve le module. Si vous devez charger un module pendant que le serveur est en cours d'exécution, vous pouvez envoyer le signal HUP ou AP_SIG_GRACEFUL au serveur. Une fois le signal reçu, Apache rechargera le module sans redémarrer le serveur.
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).
5. Mode ISAPI
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.
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!