Heim  >  Artikel  >  Backend-Entwicklung  >  In diesem Artikel erhalten Sie eine ausführliche Analyse von PHP-FMP

In diesem Artikel erhalten Sie eine ausführliche Analyse von PHP-FMP

青灯夜游
青灯夜游nach vorne
2021-06-08 18:40:492694Durchsuche

Dieser Artikel gibt Ihnen eine detaillierte Einführung in PHP-FMP. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

In diesem Artikel erhalten Sie eine ausführliche Analyse von PHP-FMP

Was ist PHP-FPM? Bevor Sie PHP-FPM verstehen, denken Sie bitte zuerst über eine Web-Anfrage (Niginx-Server) im PHP-Code nach. Was machen wir also? Kann ich über $_POST,$_GET,$_SERVER einige Anfrageinformationen erhalten? Auf welches Format sollten wir uns bei der Zusammenstellung von Daten beziehen?

    Tatsächlich wissen wir, dass jede dynamische Sprache, also interpretierte Sprache, einen entsprechenden Parser durchlaufen muss, um vom Server (hier dem Webserver) erkannt zu werden, aber der Interpreter und der Server müssen einem bestimmten Protokoll folgen Damit beide Parteien dies tun können Für die normale Kommunikation ist dieses Protokoll das CGI-Protokoll, aber der Mechanismus von CGI besteht darin, dass jedes Mal, wenn es auf eine Webanforderung antwortet, ein neuer Verarbeitungsprozess erstellt und initialisiert wird und der Prozess beendet wird, wenn die Die Anfrage ist abgeschlossen. Dann muss jede Anfrage diese drei Schritte ausführen: Erstellen->Initialisieren->Ende. Tatsächlich verschwendet dieser Prozess nicht nur Ressourcen, sondern ist auch sehr ineffizient. Was zu tun? Als Reaktion auf die Zeit wurde FastCGI entwickelt, um einen residenten Serviceprozess zu starten. Dadurch wird die wiederholte Erstellung und Beendigung des Prozesses vermieden. Es ist nicht erforderlich, die Umgebungsvariable erneut abzurufen. Immer wenn eine Webanforderung vorliegt, startet der FastCGI-Manager, d. h. der residente Dienstprozess, den CGI-Interpreterprozess.In diesem Artikel erhalten Sie eine ausführliche Analyse von PHP-FMP
  • $_POST,$_GET,$_SERVER获取一些请求信息呢?我们应该参照什么格式去组装数据呢?

其实我们知道,每种动态语言,也就是解释性语言,都需要通过对应的解析器才能被服务器(这里指web服务器)识别,但是解释器和服务器 必须遵循某种协议,双方才能够正常通信,那么这种协议就是CGI协议,但是CGI的机制是每响应一次web请求,都会创建和初始化一个新的处理进程,请求结束就kill掉这个进程。那每次请求,都要执行这三步  创建->初始化->结束,那其实这个过程不仅浪费了资源,而且效率也很低。那怎么办?FastCGI应时而生,作为CGI的改良版本,FastCGI会启动一个常驻服务进程,这个进程不需要管理生命周期,也就避免了进程的重复的创建和结束,另一方面,不需要再重复的读取环境变量,每当有web请求过来,由FastCGI管理器,也就那个常驻服务进程去启动CGI解释器进程

In diesem Artikel erhalten Sie eine ausführliche Analyse von PHP-FMP

  • 好了,既然有了CGI,那么针对这些解释性语言,比如php phython,都要根据自己的语言做一个适配吧。那么php官方就弄出来了PHP-CGI,php定制版的CGI。
  • 但是随着使用,大家发现了PHP-CGI的问题

1.修改php.ini 后必须重启PHP-CGI才可以生效,而不能实现平滑重启 2.直接干掉PHP-CGI,php就不能运行了,这显然是不能接受的 3.这玩意不会自己管理进程,它只能解析请求,返回结果

那么FastCGI都已经到来了,php的FastCGI还会远吗,当然不会,到 2004年一个叫 Andrei Nigmatulin的屌丝发明了PHP-FPM,PHP-FMP 全名叫做PHP-FASTCGI Process Manager,说白了就是php定制版的FastCGI(这里强调一下,不管是PHP-CGI 还是 PHP-FPM都是为了实现CGI协议,而不是一种新的协议),其实有一句话刚才我没说,网上很多人说PHP-CGI 就是 php管理FAST-CGI的一种程序,那你现在知道了PHP-FMP 全名叫做PHP-FASTCGI Process Manager之后,你可以理直气壮的跟他们说no,并给他们普及一下这个知识点了。

php-fpm的进程包括 master(常驻服务程序)和worker进程两种

master进程
  • master负责进程的调度(比如worker进程不够的时候去fork一个子进程)
  • 负责监听端口,一般是9000这个端口,可以在配置文件里面设置,当然,还有另外一种方式,就是通过socket,可以通过netstat -nap | grep master的进程号 查看端口信息(9000端口其实就是tcp的通信方式,而socket是说的unix socket,从效率上来说,unix socket显然是最好的,因为它是进程之间的通信,但是unix socket要保证是在一台服务器,如果是不同机器之间的通信,还是要使用tcp通信)

In diesem Artikel erhalten Sie eine ausführliche Analyse von PHP-FMP

In diesem Artikel erhalten Sie eine ausführliche Analyse von PHP-FMP

  • 接收来自服务器的请求
work进度 看名字就知道了,就是真正的打工阶级,代码真正执行的地方

In diesem Artikel erhalten Sie eine ausführliche Analyse von PHP-FMP

  • 再来看看php-fmp和nignx是怎么通信的

以socker通信为栗子,nginx的conf文件里面,可以看到下面这段信息

        location ~ [^/]\.php(/|$)
        {
            try_files $uri =404;
            fastcgi_pass  unix:/tmp/php-cgi.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
        }

相信这段信息大家都可以看明白,/tmp/php-cgi.sock 就是php和nginx联系的桥梁,同时我们也看到了include fastcgi.conf

Okay, jetzt, wo es CGI gibt, dann für diese interpretierten Sprachen , wie PHP Phython, alle Nehmen Sie eine Anpassung entsprechend Ihrer eigenen Sprache vor. Dann entwickelte der PHP-Beamte PHP-CGI, PHPs angepasste Version von CGI.

Aber bei der Verwendung entdeckte jeder Probleme mit PHP-CGI

    1 Nach dem Ändern von php.ini muss PHP-CGI neu gestartet werden, damit es wirksam wird, und ein reibungsloser Neustart ist nicht möglich 2. Wenn Sie PHP-CGI direkt beenden, kann PHP nicht ausgeführt werden. Dies ist offensichtlich inakzeptabel. 3. Dieses Ding verwaltet den Prozess nicht selbst, es kann nur die Anfrage analysieren und das Ergebnis zurückgeben 2004 Der vollständige Name von PHP-FPM, PHP-FMP, lautet PHP-FASTCGI Process Manager. Um es ganz klar auszudrücken: Es handelt sich um eine angepasste Version von FastCGI für PHP (ich möchte hier betonen, dass sowohl PHP-CGI als auch PHP-FPM sind). Um das CGI-Protokoll zu implementieren, gibt es tatsächlich eine Sache, die ich gerade nicht gesagt habe. Viele Leute im Internet sagen, dass PHP-CGI ein Programm für PHP ist, um FAST-CGI zu verwalten Sie wissen, dass der vollständige Name von PHP-FMP PHP-FASTCGI Process Manager ist. Sie können getrost Nein sagen und dieses Wissen an sie weitergeben.
  • php-fpm-Prozesse umfassen Master- (residentes Serviceprogramm) und Worker-Prozesse

Der Master-Prozess

🎜🎜Master ist für die Prozessplanung verantwortlich (z. B. wenn nicht genügend Arbeitsprozesse vorhanden sind, einen untergeordneten Prozess verzweigen)🎜🎜ist für den Überwachungsport verantwortlich, normalerweise 9000, der in der Konfigurationsdatei festgelegt werden kann. Natürlich gibt es eine andere Möglichkeit, Socket zu verwenden. Sie können die Portinformationen über netstat -nap | Aus Effizienzgründen ist der Unix-Socket offensichtlich der beste, da es sich um die Kommunikation zwischen Prozessen handelt, aber der Unix-Socket muss sich auf einem Server befinden. Wenn es sich um eine Kommunikation zwischen verschiedenen Computern handelt, muss weiterhin TCP-Kommunikation verwendet werden 🎜🎜🎜<img src="https://img.php.cn/upload/image/234/712/155/1623148204834768.png" title="1623148204834768.png" alt="In diesem Artikel erhalten Sie eine ausführliche Analyse von PHP-FMP">🎜🎜🎜Erhalten Sie Anfragen von der server🎜 🎜<h5 data-id="heading-3">🎜Sie können den Arbeitsfortschritt schon am Namen erkennen, es handelt sich um die echte Arbeiterklasse, in der der Code tatsächlich ausgeführt wird🎜</h5>🎜<img src="https://img.%20php.cn/upload/image/832/290/180/1623148208896465.png" title="1623148208896465.png" alt="In diesem Artikel erhalten Sie eine ausführliche Analyse von PHP-FMP">🎜🎜🎜Lassen Sie uns einen Blick darauf werfen Wie php-fmp und nignx kommunizieren🎜 🎜🎜 Am Beispiel der Socker-Kommunikation können Sie in der conf-Datei von nginx die folgenden Informationen sehen 🎜<pre class="brush:php;toolbar:false;">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 &quot;open_basedir=NULL&quot;;</pre>🎜 Ich glaube, dass jeder diese Informationen verstehen kann ist die Brücke zwischen PHP und Nginx. Gleichzeitig haben wir auch <code>include fastcgi.conf gesehen, werfen wir einen Blick darauf🎜
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
🎜Wir haben einige bekannte gesehen, wie z. B. REMOTE_ADDR, REQUEST_URI, jetzt sollten Sie es tun Verstehen Sie, die Informationen, die wir über $_SERVER erhalten haben, sind das, was in dieser Konfigurationsdatei angegeben ist🎜🎜Werfen wir einen Blick auf die Konfigurationsdatei von php-fmp (bitte achten Sie auf die Kommentare darin, ich werde sie nicht erklären)🎜
# 强制关闭
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]
🎜🎜Über die zugehörigen Vorgänge von PHP-FPM🎜🎜🎜INT, TERM QUIT reibungslose Beendigung USR1 öffnet die Protokolldatei erneut USR2 lädt alle Arbeitsprozesse reibungslos neu und lädt Konfigurations- und Binärmodule neu🎜

启动: /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视频教程

Das obige ist der detaillierte Inhalt vonIn diesem Artikel erhalten Sie eine ausführliche Analyse von PHP-FMP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen