Maison  >  Article  >  développement back-end  >  Cet article vous donnera une analyse approfondie de PHP-FMP

Cet article vous donnera une analyse approfondie de PHP-FMP

青灯夜游
青灯夜游avant
2021-06-08 18:40:492694parcourir

Cet article vous donnera une introduction détaillée à PHP-FMP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Cet article vous donnera une analyse approfondie de PHP-FMP

Qu'est-ce que php-fpm

  • Avant de comprendre php-fpm, réfléchissez d'abord à une question, une L'utilisateur a lancé une requête Web (serveur niginx) dans le code php, alors comment pouvons-nous obtenir des informations de requête via $_POST,$_GET,$_SERVER ? À quel format doit-on se référer pour assembler les données ?

En fait, nous savons que chaque langage dynamique, c'est-à-dire un langage interprété, a besoin d'un analyseur correspondant pour être reconnu par le serveur (ici, le serveur web), mais l'interprète et le serveur doivent suivre certain Ce n'est que via ce protocole que les deux parties peuvent communiquer normalement, alors ce protocole est le protocole CGI, mais le mécanisme de CGI est que chaque fois qu'il répond à une requête Web, un nouveau processus de traitement sera créé et initialisé, et ce processus sera tué lorsque la demande sera terminée. Ensuite, chaque requête doit effectuer ces trois étapes : Créer->Initialiser->Fin. En fait, ce processus gaspille non seulement des ressources, mais est également très inefficace. Ce qu'il faut faire? FastCGI est apparu en réponse à l'époque. En tant que version améliorée de CGI, FastCGI démarrera un processus de service résident. Ce processus n'a pas besoin de gérer le cycle de vie, évitant ainsi la création et l'arrêt répétés du processus. il n'est pas nécessaire de lire plusieurs fois la variable d'environnement. Chaque fois qu'il y a une requête Web, le gestionnaire FastCGI, c'est-à-dire le processus de service résident, démarre le processus d'interprétation CGI

Cet article vous donnera une analyse approfondie de PHP-FMP

<.>
    Bon, maintenant que CGI est disponible, pour ces langages interprétés, comme le php phython, vous devez faire une adaptation selon votre propre langage. Ensuite, le responsable PHP a proposé PHP-CGI, la version personnalisée de PHP de CGI.
  • Cependant, avec l'utilisation, tout le monde a découvert des problèmes avec PHP-CGI
1 Après avoir modifié php.ini, vous devez redémarrer PHP-CGI pour prendre effet, et un redémarrage en douceur ne peut pas être effectué. atteint 2. Si vous tuez directement PHP-CGI, php ne pourra pas fonctionner. C'est évidemment inacceptable. 3. Cette chose ne gérera pas le processus par elle-même, elle ne peut qu'analyser la requête et renvoyer le résultat

Alors FastCGI est arrivé, le FastCGI de PHP sera-t-il loin derrière. Bien sûr que non, d'ici 2004 un homme nommé Andrei ? Nigmatulin Le perdant a inventé PHP-FPM. Le nom complet de PHP-FMP s'appelle PHP-FASTCGI Process Manager. Pour parler franchement, il s'agit d'une version personnalisée de FastCGI pour PHP (je voudrais souligner ici que PHP-CGI et PHP-FMP). PHP-FPM est conçu pour implémenter le protocole CGI, et ce n'est pas un nouveau protocole). En fait, il y a une chose que je n'ai pas dite tout à l'heure. Beaucoup de gens sur Internet disent que PHP-CGI est un programme pour PHP. pour gérer FAST-CGI. Vous savez maintenant que le nom complet de PHP-FMP est PHP-FASTCGI Process. Après être devenu Manager, vous pouvez leur dire non en toute confiance et leur transmettre ces connaissances.

Les processus de php-fpm incluent les processus maître (programme de service résident) et les processus de travail

processus maître
    Le maître est responsable de la planification des processus (par exemple, lorsqu'il n'y a pas assez de processus de travail, il créera un processus enfant)
  • est responsable du port d'écoute, généralement 9000, qui peut être défini dans la configuration fichier Bien sûr, il existe une autre façon d'utiliser socket, vous pouvez afficher les informations sur le port via
  • (le port 9000 est en fait la méthode de communication de TCP, et socket fait référence à un socket unix. En termes d'efficacité, un socket unix. est évidemment le meilleur car c'est un processus de communication entre eux, mais le socket unix doit être sur un seul serveur. S'il s'agit d'une communication entre différentes machines, la communication TCP doit toujours être utilisée) netstat -nap | grep master的进程号

Cet article vous donnera une analyse approfondie de PHP-FMP

Cet article vous donnera une analyse approfondie de PHP-FMP

Recevoir les demandes du serveur
Vous pouvez connaître l'avancement des travaux simplement en regardant le nom, il est la vraie classe ouvrière, où le code est réellement exécuté

Cet article vous donnera une analyse approfondie de PHP-FMP

Regardons comment php-fmp et nignx communiquent
  • Prenons l'exemple de la communication socker, dans le fichier de configuration de nginx , vous pouvez voir les informations suivantes
        location ~ [^/]\.php(/|$)
        {
            try_files $uri =404;
            fastcgi_pass  unix:/tmp/php-cgi.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
        }

Je pense que tout le monde peut comprendre cette information /tmp/php-cgi.sock est le pont. entre php et nginx En même temps, nous avons également vu

, Jetons un coup d'œil à

root@6d05153a8988:/usr/local/nginx/conf# cat fastcgi.conf

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;
fastcgi_param PHP_ADMIN_VALUE "open_basedir=NULL";
include fastcgi.conf Nous en avons vu quelques-uns familiers, tels que REMOTE_ADDR, REQUEST_URI. via $_SERVER est ce qui est spécifié dans ce fichier de configuration

Jetons un coup d'œil au fichier de configuration de php-fmp (veuillez faire attention aux commentaires à l'intérieur, je ne l'expliquerai pas)

root@6d05153a8988:/usr/local/php/etc# cat php-fpm.conf
[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice

[www]
listen = /tmp/php-cgi.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
# 如何控制子进程,选项有static和dynamic
#区别:
#如果dm设置为 static,那么其实只有pm.max_children这个参数生效。系统会开#启设置数量的php-fpm进程。
#如果dm设置为 dynamic,那么pm.max_children参数失效,后面3个参数生效。
#系统会在php-fpm运行开始 的时候启动pm.start_servers个php-fpm进程,
#然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之#间调整php-fpm进程数。
pm = dynamic
# 静态方式下开启的php-fpm进程数量
pm.max_children = 20
# 动态方式下的起始php-fpm进程数量
pm.start_servers = 10
# 动态方式下的最小php-fpm进程数
pm.min_spare_servers = 10
# 动态方式下的最大php-fpm进程数量
pm.max_spare_servers = 20
# php-fpm子进程能处理的最大请求数
pm.max_requests = 1024
pm.process_idle_timeout = 10s
request_terminate_timeout = 100
request_slowlog_timeout = 0
slowlog = var/log/slow.log

Opérations liées à php-fpm
  • INT, TERM QUITTER une terminaison en douceur USR1 rouvre le fichier journal USR2 recharge en douceur tous les processus de travail et recharge la configuration et les modules binaires

启动: /usr/local/php/sbin/php-fpm查看进程数: ps aux | grep -c php-fpm查看mater进程号:ps aux|grep 'php-fpm: master'|grep -v grep|awk '{print $2}' 或者cat /usr/local/php/var/run/php-fpm.pid

# 强制关闭
pkill php-fpm

kill -INT `cat /usr/local/php/var/run/php-fpm.pid` 
kill -INT [pid]

# 平滑重启 其实就是通过创建新的进程使 php.ini 生效
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
kill -USR2 [pid]
小结

至此,php-fpm 算是说完了,其实通过上面的解说,大家也会明白一个问题,为什么lnmp 承受的并发比lamp高,除了nginx的高性能之外,php-fpm 是不是也是其中的一个原因呢?

推荐学习:《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