Maison  >  Article  >  développement back-end  >  Explication détaillée de ce qu'est PHP-FPM en PHP ? A quoi ça sert ?

Explication détaillée de ce qu'est PHP-FPM en PHP ? A quoi ça sert ?

青灯夜游
青灯夜游avant
2020-07-17 15:26:2714004parcourir

Explication détaillée de ce qu'est PHP-FPM en PHP ? A quoi ça sert ?

PHP-FPM (PHP FastCGI Process Manager) signifie : gestionnaire de processus PHP FastCGI, logiciel utilisé pour gérer le pool de processus PHP et utilisé pour accepter les requêtes des serveurs web.

Fonction

PHP-FPM fournit une meilleure méthode de gestion des processus PHP, qui peut contrôler efficacement la mémoire et les processus, et recharger en douceur la configuration PHP. [Recommandations associées : Tutoriel PHP]

(1) Pourquoi php-fpm apparaît-il

fpm apparaît-il à cause de php-fastcgi ? Un programme implémenté pour bien gérer php-fastcgi

(2). Qu'est-ce que php-fastcgi

php-fastcgi est juste un programme cgi qui analyse uniquement les requêtes php et renvoie En conséquence, il ne sera pas géré (d'où php-fpm).

(3) Pourquoi ne pas l'appeler php-cgi

En fait, il y avait un php-cgi avant l'apparition de php-fastcgi, mais son efficacité d'exécution était faible, il a donc été remplacé par php -fastcgi .

(4) Quelle est la différence entre fastcgi et cgi ?

Chers amis, la différence est énorme. Lorsqu'un serveur Web de service (nginx) distribue une requête, il sait que la requête est une requête php dynamique en faisant correspondre le suffixe, et transmettra la requête à php.

À l'ère de CGI, la pensée était relativement conservatrice. Après l'arrivée d'une requête, les informations de configuration de base dans php.ini étaient lues, l'environnement d'exécution était initialisé et un processus était créé à chaque lecture. la configuration, l'initialisation de l'environnement, le retour des données et la sortie du processus, avec le temps, le travail de démarrage du processus devient fastidieux et particulièrement fatiguant.

Quand PHP est arrivé à l'ère 5, tout le monde était particulièrement dégoûté par cette façon de travailler. Les gens qui voulaient être paresseux se demandaient désespérément : puis-je laisser cgi démarrer un processus principal (maître) à la fois et. le rendre en lecture seule ? Obtenez la configuration une fois, puis démarrez plusieurs processus de travail. Lorsqu'une demande arrive, elle est transmise au travailleur via le maître pour éviter la duplication du travail. C'est ainsi que fastcgi est né.

(5) Fastcgi est tellement bon, que dois-je faire si je manque de travailleurs démarrés ?
Quand il n'y a pas assez de travailleurs, le maître démarrera dynamiquement les travailleurs grâce aux informations de la configuration, et pourra reprendre les travailleurs lorsqu'ils sont inactifs

(6) Je ne comprends toujours pas ce que php -fpm est-il ?
Il s'agit de gérer le programme qui démarre un processus maître et plusieurs processus de travail. PHP-FPM créera un processus maître et contrôlera quand et comment transmettre les requêtes HTTP à un ou plusieurs processus enfants pour traitement.

Le processus principal PHP-FPM contrôle également quand créer (gérer plus de trafic depuis l'application Web) et détruire (le processus enfant est en cours d'exécution depuis trop longtemps ou n'est plus nécessaire) Processus enfants PHP . Chaque processus du pool de processus PHP-FPM existe depuis plus longtemps qu'une seule requête HTTP et peut gérer 10, 50, 100, 500 requêtes HTTP ou plus.

Installation

PHP a incorporé php-fpm dans le code principal de PHP après la version 5.3.3. Ainsi, php-fpm ne nécessite pas de téléchargement ni d'installation séparés. Si vous souhaitez que php prenne en charge php-fpm, il vous suffit d'inclure --enable-fpm lors de la compilation du code source php.

Configuration globale

Dans Centos, le fichier de configuration principal de PHP-FPM est /etc/php7/php-fpm.conf. Un sous-processus spécifié échoue dans une période de temps spécifiée. PHP-FPM redémarre :

#在指定的一段时间内,如果失效的PHP-FPM子进程数超过这个值,PHP-FPM主进程将优雅重启。
emergency_restart_threshold = 10

#设定emergency_restart_interval 设置采用的时间跨度。
emergency_restart_interval = 1m

Configurer le pool de processus

Le reste du fichier de configuration PHP-FPM est une zone appelée Pool Definitions. Cette zone configure les paramètres utilisateur pour chaque pool de processus PHP-FPM. Le pool de processus PHP-FPM est une série de sous-processus PHP associés.

Habituellement, une application PHP possède son propre pool de processus

Centos introduit le fichier de définition du pool de processus en haut du fichier de configuration principal PHP-FPM :

include=/etc/php7/php-fpm.d/*.conf

www.conf est le fichier de configuration par défaut

pour le pool de processus PHP-FPM.

user= nobody
#拥有这个 PHP-FPM进程池中子进程的系统用户。要把这个设置的值设用的非根用户的用户名。

group = nobody
#拥有这个 PHP-FPM进程池中子进程的系统用户组。要把这个设置的值设应用的非根用户所属的用户组名。

listen=[::]]:9000
#PHP-FPM进程池监听的IP地址和端口号,让 PHP-FPM 只接受 nginx从这里传入的请求。

listen. allowed clients =127.0.0.1
#可以向这个 PHP-FPM进程池发送请求的IP地址(一个或多个)。

pm.max children =51
#这个设置设定任何时间点 PHP-FPM进程池中最多能有多少个进程。这个设置没有绝对正确的值,你应该测试你的PHP应用,确定每个PHP进程需要使用多少内存,然后把这个设置设为设备可用内存能容纳的PHP进程总数。对大多数中小型PHP应用来说,每个PHP进程要使用5~15MB内存(具体用量可能有差异)。 假设我们使用设备为这个PHP-FPM进程池分配了512MB可用内存,那么可以把这个设置设为(512MB总内存)/(每个进程使用10MB) = 51个进程。

...

Modifiez et enregistrez, redémarrez le processus principal PHP-FPM :

sudo systemctl restart php-fpm.service
Pour plus de détails sur la configuration du pool de processus PHP-FPM, veuillez consulter http://php.net/manual /install.fpm.configuration.php

Environnement de développement de l'entreprise de référence

La configuration de l'environnement de test est la suivante :

[www]
user = nobody               #进程的发起用户和用户组,用户user是必须设置,group不是  nobody 任意用户
group = nobody

listen = [::]:9000          #监听ip和端口,[::] 代表任意ip
chdir = /app                #在程序启动时将会改变到指定的位置(这个是相对路径,相对当前路径或chroot后的“/”目录) 

pm = dynamic                #选择进程池管理器如何控制子进程的数量  #static: 对于子进程的开启数路给定一个锁定的值(pm.max_children) #dynamic: 子进程的数目为动态的,它的数目基于下面的指令的值(以下为dynamic适用参数)
pm.max_children = 16        #同一时刻能够存货的最大子进程的数量
pm.start_servers = 4        #在启动时启动的子进程数量
pm.min_spare_servers = 2    #处于空闲"idle"状态的最小子进程,如果空闲进程数量小于这个值,那么相应的子进程会被创建
pm.max_spare_servers = 16   #最大空闲子进程数量,空闲子进程数量超过这个值,那么相应的子进程会被杀掉。
catch_workers_output = Yes  #将worker的标准输出和错误输出重定向到主要的错误日志记录中,如果没有设置,根据FastCGI的指定,将会被重定向到/dev/null上
Configuration de l'environnement de production :

Transférer la requête à PHP-FPM

nginx à titre d'exemple :

server {
       listen       83;
       server_name mobile.com;
       root /app/mobile/web/;

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

        location / {
                index  index.html index.htm index.php;
                # Redirect everything that isn't a real file to index.php
                try_files $uri $uri/ /index.php$is_args$args;
        }

        #把HTTP请求转发给PHP-FPM进程池处理
        location ~ .*\.php                 include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass   192.168.33.30:9000;      #监听9000端口
                fastcgi_index  index.php;
                try_files $uri =404;
                #include fastcgi.conf;
        }
        location ~ /\.(ht|svn|git) {
                deny all;
        }
        access_log  /app/wwwlogs/access.log;
        error_log   /app/wwwlogs/error.log;
}

php-fpm démarre, redémarre, termine l'opération

Démarrer php-fpm :

/usr/sbin/php-fpm
或
/usr/local/php/sbin/php-fpm
php 5.3.3 et versions ultérieures php-fpm ne sont plus prend en charge le /usr/local/php/ que php-fpm avait auparavant. sbin/php-fpm (start|stop|reload) et d'autres commandes, alors ne regardez plus cette commande à l'ancienne, vous devez utiliser signal. contrôle :

Le processus maître peut comprendre les signaux suivants

INT, TERM Terminer immédiatement

QUIT Terminer en douceur

USR1 Rouvrir le fichier journal
USR2 Recharger en douceur tous les processus de travail et recharger la configuration et les modules binaires



Une méthode simple de redémarrage direct :

Vérifiez d'abord le numéro du processus maître de php-fpm
# ps aux|grep php-fpm
root     21891  0.0  0.0 112660   960 pts/3    R+   16:18   0:00 grep --color=auto php-fpm
root     42891  0.0  0.1 182796  1220 ?        Ss   4月18   0:19 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
nobody   42892  0.0  0.6 183000  6516 ?        S    4月18   0:07 php-fpm: pool www
nobody   42893  0.0  0.6 183000  6508 ?        S    4月18   0:17 php-fpm: pool www

Redémarrez php- fpm:

kill -USR2 42891

La solution ci-dessus ne génère généralement pas de fichier php-fpm.pid, si vous souhaitez générer php-fpm.pid, utilisez la solution suivante :

上面master进程可以看到,matster使用的是/usr/local/php/etc/php-fpm.conf这个配置文件,cat /usr/local/php/etc/php-fpm.conf 发现:

[global]
; Pid file
; Note: the default prefix is /usr/local/php/var
; Default Value: none
;pid = run/php-fpm.pid

pid文件路径应该位于/usr/local/php/var/run/php-fpm.pid,由于注释掉,所以没有生成,我们把注释去除,再kill -USR2 42891 重启php-fpm,便会生成pid文件,下次就可以使用以下命令重启,关闭php-fpm了:

php-fpm 关闭:
kill -INT 'cat /usr/local/php/var/run/php-fpm.pid'
php-fpm 重启:
kill -USR2 'cat /usr/local/php/var/run/php-fpm.pid'

相关学习推荐: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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer