Maison  >  Article  >  développement back-end  >  Explication détaillée des quatre modes de fonctionnement PHP

Explication détaillée des quatre modes de fonctionnement PHP

小云云
小云云original
2018-05-12 11:26:415184parcourir

Il existe 4 modes de fonctionnement pour PHP :

1) cgi Common Gateway Interface)

2) fast-cgi résident (longue durée de vie) tapez CGI php-fpm

3) opération en ligne de commande cli (interface de ligne de commande)

4) mode module Web (mode module exécuté par des serveurs Web tels que Apache)

1. CGI (Common Gateway Interface)

CGI est la Common Gateway Interface (Common Gateway Interface). C'est un programme en termes simples. un pont qui relie la page Web et 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 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-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 processus enfants CGI qu'il y a de demandes de connexion. Le chargement répété de processus enfants 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 cgi. Le processus sera bifurqué. 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 elle n'est pas trouvée dans le répertoire /cgi-bin/ php-cgi. Vous pouvez en copier un depuis le bac php.

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.

Question :

1) Si le programme cgi ne peut pas être exécuté dans /usr/local/httpd/cgi-bin/ et qu'une erreur 403 ou 500 est rencontrée

Ouvrez le journal des erreurs Apache et l'invite suivante apparaîtra : 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 via chcon sur

httpd_sys_script_exec_t. 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 le fichier. Quelle est la première phrase du résultat ? Elle doit être similaire à ce qui suit

Content-type: text/plain; Deux lignes vides doivent être affichées après avoir déclaré le type de contenu.

3) Message d'erreur Apache : Erreur de format d'exécution

Erreur de paramétrage de l'interpréteur de script. La première ligne du script doit être sous la forme '#!Interpreter Path', en remplissant le chemin de l'interpréteur de script. 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 cgi, FastCGI est comme un CGI de type longue durée de vie qui peut être exécuté. tout le temps Tant qu'il est activé, il ne faudra pas de temps pour 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, démarre plusieurs processus d'interprétation CGI (plusieurs php-cgi.exe visibles dans le gestionnaire de tâches) et attend 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 ou .exe se termine 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.

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 peut facilement le supprimer, puis redistribuer de nouveaux processus pour exécuter la logique.

2) D'un point de vue sécurité, Fastcgi prend en charge l'informatique distribuée. Fastcgi est complètement indépendant du serveur hôte, peu importe la panne de fastcgi, il ne fera pas tomber le serveur

3) D'un point de vue performances. , fastcgi peut contrôler le traitement logique dynamique du serveur et 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, le traitement logique peut être effectué. seulement une petite partie, et un grand nombre d'images statiques et ainsi de suite

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 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.

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, éditez top_dir = /usr/local/httpd

make

make install

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, php-cgi dans le répertoire PHP bin est l'interpréteur php en mode fastcgi

Après une installation réussie, exécutez

php -v Output

PHP 5.3.2 (cgi-fcgi).

La sortie ici inclut cgi-fcgi

Remarque :

1. les paramètres ne peuvent pas être ajoutés –with-apxs=/usr/local/httpd/bin/apxs Sinon, le fichier exécutable PHP installé est en mode cli

2 Si vous n'ajoutez pas --disable-cli lors de la compilation, PHP 5.3.2 sera sorti ( cli)

3) Configurer Apache

Besoin de configurer Apache pour exécuter le programme php en mode fastcgi

vi httpd.conf

La façon dont nous utilisons la machine virtuelle Implémentation :

#Load fastcgi module

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>
 
或者
<IfModule mod_fastcgi>ScriptAlias /fcgi-bin/ "/usr/local/php/bin"
 #定义目录映射FastCgiServer /usr/local/php/bin/php-cgi   -processes 10 
 #配置fastcgi server,<Directory "/usr/local/httpd/fcgi-bin/">
 SetHandler fastcgi-scriptOptions FollowSymLinksOrder allow,denyAllow from all
 </Directory>AddType application/x-httpd-php .php  
 #增加MIME类型AddHandler php-fastcgi .php   
 #.php结尾的请求都要用php-fastcgi来处理Action php-fastcgi /fcgi-bin/php-cgi 
 #设置php-fastcgi的处理器
</IfModule>

4).restart apache, vérifiez phpinfo, si les informations du serveur sont :

Apache/2.2.11 (Unix) mod_fastcgi/ 2.4.6 ou quelque chose comme ça 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>
改为:
<Directory />
    Options FollowSymLinks
    AllowOverride None
Order allow,deny
Allow from all
</Directory>

feront l'affaire.

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 l'avez peut-être pas remarqué. ( Par exemple : nous utilisons souvent "php -m" sous Linux pour savoir quelles extensions PHP a installées, quel est le mode d'exécution de la ligne de commande PHP ; les étudiants intéressés peuvent saisir php -h pour étudier en profondeur le mode d'exécution)

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 de fichier et n'importe quelle 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 php | | sort -u >final_output.txt

4. Mode module

Le mode module est intégré sous la forme du module mod_php5, à ce niveau. time mod_php5 La fonction du module est de recevoir les requêtes de fichiers PHP transmises par Apache, de traiter ces requêtes, puis de renvoyer 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 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, ni même de l'arrêter du tout. 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 :

Ce mode de fonctionnement est ce que nous utilisons souvent lors de l'utilisation du serveur Apache dans l'environnement Windows. En modularisation (DLL), PHP est le serveur web. est opérationnel ensemble. (C'est une extension d'Apache basée sur CGI pour accélérer l'efficacité opérationnelle de PHP)

[plain]view plaincopyprint?

1 LoadModule php5_module modules/mod_php5.so

Ici, nous utilisons la commande LoadModule. Le premier paramètre de la commande est le nom du module. Le nom se trouve 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.

Recommandations associées :

Résumé des modes d'exécution de PHP

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn