溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP-FMP指的是什么

發(fā)布時間:2021-06-09 09:33:28 來源:億速云 閱讀:152 作者:小新 欄目:編程語言

小編給大家分享一下PHP-FMP指的是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

什么是php-fpm

  • 在了解php-fpm之前,請大家先思考一個問題,一個用戶發(fā)起了一個web(niginx服務(wù)器)請求,在php代碼里面,那么我們怎么樣才可以通過 $_POST,$_GET,$_SERVER獲取一些請求信息呢?我們應(yīng)該參照什么格式去組裝數(shù)據(jù)呢?

其實我們知道,每種動態(tài)語言,也就是解釋性語言,都需要通過對應(yīng)的解析器才能被服務(wù)器(這里指web服務(wù)器)識別,但是解釋器和服務(wù)器 必須遵循某種協(xié)議,雙方才能夠正常通信,那么這種協(xié)議就是CGI協(xié)議,但是CGI的機制是每響應(yīng)一次web請求,都會創(chuàng)建和初始化一個新的處理進程,請求結(jié)束就kill掉這個進程。那每次請求,都要執(zhí)行這三步  創(chuàng)建->初始化->結(jié)束,那其實這個過程不僅浪費了資源,而且效率也很低。那怎么辦?FastCGI應(yīng)時而生,作為CGI的改良版本,F(xiàn)astCGI會啟動一個常駐服務(wù)進程,這個進程不需要管理生命周期,也就避免了進程的重復的創(chuàng)建和結(jié)束,另一方面,不需要再重復的讀取環(huán)境變量,每當有web請求過來,由FastCGI管理器,也就那個常駐服務(wù)進程去啟動CGI解釋器進程

PHP-FMP指的是什么

  • 好了,既然有了CGI,那么針對這些解釋性語言,比如php phython,都要根據(jù)自己的語言做一個適配吧。那么php官方就弄出來了PHP-CGI,php定制版的CGI。

  • 但是隨著使用,大家發(fā)現(xiàn)了PHP-CGI的問題

1.修改php.ini 后必須重啟PHP-CGI才可以生效,而不能實現(xiàn)平滑重啟 2.直接干掉PHP-CGI,php就不能運行了,這顯然是不能接受的 3.這玩意不會自己管理進程,它只能解析請求,返回結(jié)果

那么FastCGI都已經(jīng)到來了,php的FastCGI還會遠嗎,當然不會,到 2004年一個叫 Andrei Nigmatulin的屌絲發(fā)明了PHP-FPM,PHP-FMP 全名叫做PHP-FASTCGI Process Manager,說白了就是php定制版的FastCGI(這里強調(diào)一下,不管是PHP-CGI 還是 PHP-FPM都是為了實現(xiàn)CGI協(xié)議,而不是一種新的協(xié)議),其實有一句話剛才我沒說,網(wǎng)上很多人說PHP-CGI 就是 php管理FAST-CGI的一種程序,那你現(xiàn)在知道了PHP-FMP 全名叫做PHP-FASTCGI Process Manager之后,你可以理直氣壯的跟他們說no,并給他們普及一下這個知識點了。

php-fpm的進程包括 master(常駐服務(wù)程序)和worker進程兩種
master進程
  • master負責進程的調(diào)度(比如worker進程不夠的時候去fork一個子進程)

  • 負責監(jiān)聽端口,一般是9000這個端口,可以在配置文件里面設(shè)置,當然,還有另外一種方式,就是通過socket,可以通過netstat -nap | grep master的進程號 查看端口信息(9000端口其實就是tcp的通信方式,而socket是說的unix socket,從效率上來說,unix socket顯然是最好的,因為它是進程之間的通信,但是unix socket要保證是在一臺服務(wù)器,如果是不同機器之間的通信,還是要使用tcp通信)

PHP-FMP指的是什么

PHP-FMP指的是什么

  • 接收來自服務(wù)器的請求

work進度 看名字就知道了,就是真正的打工階級,代碼真正執(zhí)行的地方

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聯(lián)系的橋梁,同時我們也看到了include fastcgi.conf,我們來看一下

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";

我們看到了一些熟悉的,比如REMOTE_ADDR,REQUEST_URI,現(xiàn)在你應(yīng)該明白了,我們通過$_SERVER獲取到的信息就是這個配置文件里面指定的

我們再來看一下php-fmp的配置文件(請注意看里面的注釋,我不做解釋了)

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
#區(qū)別:
#如果dm設(shè)置為 static,那么其實只有pm.max_children這個參數(shù)生效。系統(tǒng)會開#啟設(shè)置數(shù)量的php-fpm進程。
#如果dm設(shè)置為 dynamic,那么pm.max_children參數(shù)失效,后面3個參數(shù)生效。
#系統(tǒng)會在php-fpm運行開始 的時候啟動pm.start_servers個php-fpm進程,
#然后根據(jù)系統(tǒng)的需求動態(tài)在pm.min_spare_servers和pm.max_spare_servers之#間調(diào)整php-fpm進程數(shù)。
pm = dynamic
# 靜態(tài)方式下開啟的php-fpm進程數(shù)量
pm.max_children = 20
# 動態(tài)方式下的起始php-fpm進程數(shù)量
pm.start_servers = 10
# 動態(tài)方式下的最小php-fpm進程數(shù)
pm.min_spare_servers = 10
# 動態(tài)方式下的最大php-fpm進程數(shù)量
pm.max_spare_servers = 20
# php-fpm子進程能處理的最大請求數(shù)
pm.max_requests = 1024
pm.process_idle_timeout = 10s
request_terminate_timeout = 100
request_slowlog_timeout = 0
slowlog = var/log/slow.log
  • 關(guān)于php-fpm 的相關(guān)操作

INT, TERM QUIT 平滑終止 USR1 重新打開日志文件 USR2 平滑重載所有worker進程并重新載入配置和二進制模塊

啟動: /usr/local/php/sbin/php-fpm查看進程數(shù): 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

# 強制關(guān)閉
pkill php-fpm

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

# 平滑重啟 其實就是通過創(chuàng)建新的進程使 php.ini 生效
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
kill -USR2 [pid]

以上是“PHP-FMP指的是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI