Maison > Article > développement back-end > Résumé des modes d'exécution de PHP
Il existe 4 modes de fonctionnement pour PHP :
1) cgi Common Gateway Interface)
2) fast-cgi long-live CGI
3) opération en ligne de commande cli (Command Line Interface)
4) mode module Web (mode module pour les serveurs Web tels qu'Apache à exécuter)
5) ISAPI (Internet Server Application Program Interface)
Remarque : après PHP5.3, PHP n'a plus le mode ISAPI, et il n'y a plus de fichier php5isapi.dll après l'installation. 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. CGI (Common Gateway Interface)
CGI est la Common Gateway Interface (Common Gateway Interface). En termes simples, CGI est comme un pont qui relie les pages Web. et WEB Le programme d'exécution du serveur est connecté, 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-. et-mode d'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, avec 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 le fera. fork. Cela devient un énorme fardeau pour le serveur. Imaginez simplement que des centaines de requêtes simultanées amènent le serveur à bifurquer des centaines de processus. C'est pourquoi cgi a toujours été connu pour ses faibles performances et sa consommation élevée de ressources.
Installation du mode CGI :
CGI est déjà un mode plus ancien et a rarement été utilisé ces dernières années, nous sommes donc juste à des fins de test.
Pour installer le mode CGI, vous devez commenter la ligne
LoadModule php5_module modules/libphp5.so. Si vous ne commentez pas cette ligne, elle passera en mode gestionnaire. C'est le mode module.
Ajoutez ensuite une action dans httpd.conf :
Action application/x-httpd-php /cgi-bin/
Si vous ne trouvez pas php-cgi dans le répertoire /cgi-bin/, vous pouvez téléchargez-le depuis php. Il y a un cp dans la corbeille.
Redémarrez ensuite Apache, puis ouvrez la page de test et constatez que l'API du serveur devient : CGI/FastCGI. Description : passage réussi en mode CGI.
Problème :
1) Si le programme cgi ne peut pas être exécuté s'il est placé dans /usr/local/httpd/cgi-bin/ et qu'une erreur 403 ou 500 est rencontrée
Ouverture d'Apache Le journal des erreurs affichera les invites suivantes : Autorisation refusée : l'exécutif de
peut vérifier les attributs du programme cgi. Comme défini dans le fichier de contextes Linux, /usr/local/httpd/cgi-bin/ doit être l'attribut httpd_sys_script_exec_t. Vérifiez-le avec ls -Z Sinon, changez-le avec la commande suivante : chcon -t httpd_sys_script_exec_t /var/www/cgi-bin/*.cgi S'il s'agit de cgi dans l'hôte virtuel, référez-vous à la question 2 pour le faire utiliser. fonctions normales. Après cela, définissez le contexte du fichier cgi sur
httpd_sys_script_exec_t via chcon. chcon -R -t httpd_sys_script_exec_t cgi-bin/
2) message d'erreur Apache : .... en-tête mal formé du script Mauvais en-tête =
Selon l'invite, il y a un problème avec. l'en-tête, vérifiez la sortie du fichier. Quelle est la première phrase ? Elle doit être similaire à ce qui suit
Content-type: text/plain charset=iso-8859-1nn.
3) Message d'erreur Apache : Erreur de format d'exécution
Erreur de configuration de l'interpréteur de script. La première ligne du script doit renseigner le chemin de l'interpréteur de script sous la forme '#!Interpreter Path'. S'il s'agit d'un programme PERL, le chemin commun est : #!/usr/bin/perl ou #!/. usr/local/bin /perl S'il s'agit d'un programme PHP, vous n'avez pas besoin de renseigner le chemin de l'interpréteur, le système trouvera automatiquement PHP.
2. Mode Fastcgi
Fast-cgi est une version améliorée de FastCGI est comme un CGI de longue durée. Il peut être exécuté à tout moment. ne prendra pas de temps à bifurquer à chaque fois (c'est le mode fork-and-execute le plus critiqué de CGI).
Le principe de fonctionnement de FastCGI est :
(1) Le gestionnaire de processus FastCGI est chargé au démarrage du serveur Web [le gestionnaire de processus FastCGI de PHP est PHP-FPM (php-FastCGI). Process Manager)] (IIS ISAPI ou Apache Module);
(2), le gestionnaire de processus FastCGI s'initialise et démarre plusieurs processus interpréteurs CGI (plusieurs php- peuvent être vus dans le gestionnaire de tâches) cgi. exe) et attendez la connexion du serveur Web.
(3). Lorsque la requête du 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.
(4). 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 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.
Avantages de Fastcgi :
1) Du point de vue de la stabilité, fastcgi exécute cgi dans un pool de processus indépendant. Si un seul processus meurt, le système le sera. très instable. Jetez-le facilement, puis réaffectez un nouveau processus pour exécuter la logique.
2) D'un point de vue de sécurité, Fastcgi prend en charge l'informatique distribuée. Fastcgi est complètement indépendant du serveur hôte. cela 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, de sorte que le serveur hôte. peut se concentrer sur les IO. Pour une page Web dynamique ordinaire, il peut n'y avoir qu'une petite partie du traitement logique, un grand nombre d'images statiques, etc.
Inconvénients de FastCGI :
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 lors de l'utilisation de Zend Studio pour déboguer le programme, FastCGI pensera que le processus PHP a expiré, renvoyant ainsi une erreur 500 sur la page. C'était tellement ennuyeux que je suis revenu en mode ISAPI sur ma machine de développement.
Installer le mode fastcgi :
Le chemin d'installation d'Apache est /usr/local/httpd/
Le chemin d'installation de php est /usr/local/php/
1) Installez mod_fastcgi
wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz tar zxvf mod_fastcgi-2.4.6.tar.gz cd mod_fastcgi-2.4.6 cp Makefile.AP2 Makefile vi Makefile,编辑top_dir = /usr/local/httpd make make insta
Après l'installation, il y aura un fichier supplémentaire dans
/usr/local/ httpd/modules/ :
mod_fcgid.so
2) Recompiler php
./configure –prefix=/usr/local/php –enable-fastcgi –enable-force-cgi-redirect –disable-cli make make install
Après avoir compilé de cette manière , dans le répertoire bin de PHP php-cgi se trouve l'interpréteur php en mode fastcgi
Après une installation réussie, exécutez
php -v 输出 PHP 5.3.2 (cgi-fcgi).
La sortie ici contient cgi -fcgi
Remarque :
1. Les paramètres de compilation ne peuvent pas être ajoutés –with-apxs=/usr/local/httpd/bin/apxs, sinon le php installé le fichier exécutable sera en mode cli
2 Si vous n'ajoutez pas –disable-cli lors de la compilation, PHP 5.3.2(cli)
3) Configurer Apache
Vous devez configurer apache pour exécuter le programme php en mode fastcgi
vi httpd.conf
Nous utilisons une machine virtuelle pour implémenter :
#加载fastcgi模块 LoadModule fastcgi_module modules/mod_fastcgi.so #//以静态方式执行fastcgi 启动了10进程 FastCgiServer /usr/local/php/bin/php-cgi -processes 10 -idle-timeout 150 -pass-header HTTP_AUTHORIZATION <VirtualHost *:80> # DocumentRoot /usr/local/httpd/fcgi-bin ServerName www.fastcgitest.com ScriptAlias /fcgi-bin/ /usr/local/php/bin/ #定义目录映射 /fcgi-bin/ 代替 /usr/local/php/bin/ Options +ExecCGI AddHandler fastcgi-script .php .fcgi #.php结尾的请求都要用php-fastcgi来处理 AddType application/x-httpd-php .php #增加MIME类型 Action application/x-httpd-php /fcgi-bin/php-cgi #设置php-fastcgi的处理器: /usr/local/php/bin/php-cgi <Directory /usr/local/httpd/fcgi-bin/> Options Indexes ExecCGI Order allow,deny allow from all </Directory> </VirtualHost>
4).restart apache, vérifiez phpinfo. Si les informations du serveur sont :
Apache/2.2.11 (Unix) mod_fastcgi/2.4.6 ou similaire, cela signifie que l'installation est réussie.
Si une erreur 403 se produit, vérifiez si /usr/local/httpd/fcgi-bin/ dispose des autorisations suffisantes.
ou
<Directory /> Options FollowSymLinks AllowOverride None Order deny,allow Deny from all </Directory>
c'est bien.
ps -ef|grep php-cgi peut voir 10 processus fastcgi en cours d'exécution.
3. Le mode CLI
cli est le mode d'exécution en ligne de commande de php Vous l'utilisez souvent, mais vous ne le remarquez peut-être pas (par exemple : nous l'utilisons souvent sous Linux. ) php -m" pour trouver les extensions installées par PHP est le mode d'exécution de la ligne de commande PHP ; les étudiants intéressés peuvent saisir php -h pour étudier le mode d'exécution en profondeur)
1. Laissez PHP exécuter le fichier spécifié.
php script.php php -f script.php
Les deux méthodes ci-dessus (avec ou sans le paramètre -f) peuvent exécuter le script.php du script. Vous pouvez choisir n'importe quel fichier à exécuter. Les scripts PHP que vous spécifiez n'ont pas besoin d'avoir une extension .php ; ils peuvent avoir n'importe quel nom et extension.
2. Exécutez le code PHP directement sur la ligne de commande.
php -r "print_r(get_defined_constants());"
Lors de l'utilisation de cette méthode, veuillez faire attention à la substitution des variables shell et à l'utilisation de guillemets .
Remarque : veuillez lire attentivement l'exemple ci-dessus, il n'y a pas de marqueurs de début et de fin lors de l'exécution du code ! Avec le paramètre -r, ces marqueurs sont inutiles et provoqueront une erreur de syntaxe.
3. Fournissez le code PHP qui doit être exécuté via l'entrée standard (stdin).
L'utilisation ci-dessus nous fournit des fonctions très puissantes, nous permettant de générer dynamiquement du code PHP et d'exécuter ces codes via la ligne de commande comme le montre l'exemple suivant :
$ some_application | some_filter | php | sort -u >final_output.txt
4. Mode module
Le mode module est intégré sous la forme du module mod_php5. rôle du module mod_php5 Il reçoit les requêtes de fichiers PHP transmises par Apache, traite ces requêtes, puis renvoie 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 de fichiers 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 recompiler le code source, voire pas besoin de s'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. Il faut d'abord ajouter une ligne au fichier de configuration Apache httpd.conf :
Ce mode de fonctionnement est ce que nous utilisons souvent lors de l'utilisation du serveur Apache dans l'environnement Windows, et en modularisation (DLL), PHP est opérationnel avec le serveur Web. (C'est une extension d'Apache basée sur CGI pour accélérer l'efficacité opérationnelle de PHP)
LoadModule php5_module modules/mod_php5.so
Ici, nous utilisons la commande LoadModule. Le premier paramètre de cette commande est le nom du module. Le nom peut être trouvé dans le code source 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.
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 être activée à la demande de l'utilisateur. Après cela. , il résidera en mémoire et attendra une autre demande de l'utilisateur. Vous pouvez également configurer plusieurs fonctions de traitement des demandes utilisateur dans une seule DLL. De plus, l'application DLL ISAPI et le serveur WWW sont dans le même processus, et l'efficacité est. nettement supérieur à celui 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 a démarré le système, il pré-génère plusieurs copies de processus et réside dans la mémoire. La demande se produit, elle sera traitée immédiatement. Utilisez ces sous-processus de rechange pour le traitement, afin qu'il n'y ait pas de 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.
6. Mode d'exécution de PHP dans Nginx (Nginx PHP-FPM)
Il existe deux piles courantes utilisant FastCGI : lighthttpd spawn-fcgi ; l'autre est nginx PHP-FPM (vous pouvez également utiliser spawn-fcgi).
A. Comme mentionné ci-dessus, les deux structures utilisent FastCGI pour prendre en charge PHP, donc HTTPServer est complètement libéré et peut mieux répondre et gérer simultanément. Par conséquent, lighttpd et nginx ont tous deux la réputation d’être petits, mais puissants et efficaces.
B. Les deux peuvent être divisés en bons et mauvais. Puisque spawn-fcgi fait partie de lighttpd, si lighttpd est installé, spawn-fcgi sera généralement utilisé pour prendre en charge PHP. Cependant, certains utilisateurs disent actuellement que le spwan- de lighttpd. Lorsque fcgi dispose d'un accès simultané élevé, la fuite de mémoire mentionnée ci-dessus se produira et même fastcgi redémarrera automatiquement. Autrement dit : le processeur de script PHP plante. Si l'utilisateur y accède à ce moment-là, une page blanche peut apparaître (c'est-à-dire que PHP ne peut pas être analysé ou qu'une erreur se produit).
Un autre : tout d'abord, nginx n'inclut pas fastcgi (spawn-fcgi) comme lighttpd lui-même, il est donc complètement léger, il doit utiliser un processeur FastCGI tiers pour analyser PHP, donc en fait, cela ressemble. ce nginx est très flexible. Il peut être connecté à n'importe quel processeur d'analyse tiers pour réaliser l'analyse PHP (il est facile à configurer dans nginx.conf). nginx peut utiliser spwan-fcgi (lighttpd doit être installé ensemble, mais le port doit être évité pour nginx. Certains blogs plus anciens ont des tutoriels d'installation à cet égard, cependant, puisque spawn-fcgi présente les défauts progressivement découverts par les utilisateurs comme mentionné). ci-dessus, réduisez maintenant lentement l’utilisation de la combinaison nginx spawn-fcgi.
C. En raison des défauts de spawn-fcgi, il existe maintenant un nouveau tiers (actuellement, j'ai entendu dire que nous travaillons dur pour l'ajouter au noyau PHP dans un avenir proche) FastCGI processeur pour PHP, appelé PHP -FPM (vous pouvez le rechercher sur Google pour plus de détails). Par rapport à spawn-fcgi, il présente les avantages suivants :
Puisqu'il est développé en tant que patch PHP, il doit être compilé avec le code source PHP lors de l'installation, ce qui signifie qu'il est compilé dans le noyau PHP, donc dans termes de performances C'est mieux ;
En même temps, c'est mieux que spawn-fcgi pour gérer une concurrence élevée, au moins il ne redémarrera pas automatiquement le processeur fastcgi. Les algorithmes et conceptions spécifiques utilisés peuvent être trouvés sur Google.
Par conséquent, comme mentionné ci-dessus, en raison de la légèreté et de la flexibilité de nginx, ses performances actuelles sont supérieures, et de plus en plus de personnes utilisent progressivement cette combinaison : nginx PHP/PHP-FPM
7. Résumé
Actuellement, il existe trois piles populaires qui peuvent être vues dans la zone
HTTPServer :
(1) Apache mod_php5
(2) lighttp spawn-fcgi
(3) nginx PHP-FPM
Les performances des deux derniers des trois sont peut-être légèrement meilleures, mais Apache est toujours le leader en raison de son modules et fonctions riches. Certaines personnes ont testé que nginx PHP-FPM peut atteindre 5 à 10 fois celui d'Apache mod_php5 dans des conditions de concurrence élevée. Aujourd'hui, de plus en plus de personnes utilisent nginx PHP-FPM.
Pour plus d'articles liés au résumé du mode de fonctionnement PHP, veuillez faire attention au site Web PHP chinois !