PHP-FPM的相關知識的深度解釋

 

1、 須要搞清楚幾個名詞概念php

1.          CGICommon Gateway InterfaceCGI)通用網關接口, Web 服務器運行時外部程序的規範,按CGI 編寫的程序能夠擴展服務器功能。CGI 應用程序能與瀏覽器進行交互,還可經過數據API與數據庫服務器等外部數據源進行通訊,從數據庫服務器中獲取數據。格式化爲HTML文檔後,發送給瀏覽器,也能夠將從瀏覽器得到的數據放到數據庫中。幾乎全部服務器都支持CGI,可用任何語言編寫CGI,包括流行的CC ++JavaVB Delphi 等。因此說CGI是一個協議,不是進程。CGI的存在,可使用戶經過瀏覽器來訪問執行在服務器上的動態程序;CGIWeb服務器與CGI程序間傳輸數據的標準;nginx

 

服務器端 CGI 程序接收信息有三種途徑:環境變量、命令行和標準輸入。web

命令行:<form>表單的Method=GET,向CGI 傳遞表單編碼信息是經過命令方式來進行的。數據庫

標準輸入:<form>表單的Method=POST,向CGI 傳遞表單編碼信息是經過標準輸入方式來進行的。瀏覽器

環境變量:表單編碼信息是經過環境變量QUERY_STRING 來傳遞。安全

 

瀏覽器傳遞數據方式:服務器

POST:發送數據大小不受限制,環境變量CONTENT_LENGTH 存放這發送數據的長度,CGI程序檢查環境變量REQUEST_METHOD 肯定是否採用了POST,決定是否使用標準輸入php7

GET:發送數據小於1024字節可以使用併發

URL+?屬於GET方式app

CGI工做機制

 

傳統的CGI程序執行過程

 

2.          FastCGIFast Common Gateway Interface)快速通用網關接口,是CGI的優化升級。

FastCGI發展

傳統CGI接口方式主要的缺點是性能差,由於每次HTTP服務器遇到動態程序時須要從新啓動腳本解析器(php-cgi)來執行解析,而後結果返回給HTTP服務器。那麼在處理高併發時,幾乎是不可用的。

 

FastCGI接口方式採用C/S結構,能夠將HTTP服務器和腳本解析服務器分開,同時在腳本解析服務器上啓動一個或者多個腳本解析守護進程。當HTTP服務器每次遇到動態程序時,能夠將其直接交付給FastCGI進程來執行,而後將獲得的結果返回給瀏覽器。這種方式可讓HTTP服務器專注地處理靜態請求或者將動態腳本服務器的結果返回給客戶端,這在很大程度上提升了整個應用系統的性能。

 

FastCGI 與傳統 CGI 模式的區別之一則是 Web 服務器不是直接執行 CGI 程序了,而是經過 socket FastCGI 響應器(FastCGI 進程管理器)進行交互,Web 服務器須要將 CGI 接口數據封裝在遵循 FastCGI 協議包中發送給 FastCGI 響應器程序。正是因爲 FastCGI 進程管理器是基於 socket 通訊的,因此也是分佈式的,Web服務器和CGI響應器服務器分開部署。

基於FastCGI進程管理器程序執行過程

 

3.          PHP-CGIPHP解釋器,它是個CGI程序,自己只能解析請求,不能管理進程。

4.          PHP-FPM(FastCGI Process ManagerFastCGI進程管理器)是用來調度管理PHP-FastCGI進程的程序,在PHP5.3.3以前是php內核的一個補丁包,在後來的版本中php內核集成了php-fpm

 

 

2、 Nginx+FastCGI的工做過程

 

Nginx不支持對外部程序的直接調用或者解析,全部的外部程序(包括PHP)必須經過FastCGI接口來調用。FastCGI接口在Linux下是socket,(這個socket能夠是文件socket,也能夠是ip socket)。爲了調用CGI程序,還須要一個FastCGIwrapperwrapper能夠理解爲用於啓動另外一個程序的程序),這個wrapper綁定在某個固定socket上,如端口或者文件socket。當NginxCGI請求發送給這個socket的時候,經過FastCGI接口,wrapper接收到請求,而後派生出一個新的線程,這個線程調用解釋器或者外部程序處理腳本並讀取返回數據;接着,wrapper再將返回的數據經過FastCGI接口,沿着固定的socket傳遞給Nginx;最後,Nginx將返回的數據發送給客戶端,這就是Nginx+FastCGI的整個工做過程。

3、 PHP-FPM對進程的管理

Fastcgi是一個協議,不是進程。PHP-FPM實現了這個協議,是對Fastcgi程序(php-cgi)的進程管理器。

首先,先啓一個master,解析配置文件,初始化執行環境,而後再啓動多個worker。當請求過來時,master會傳遞給一個worker,而後當即能夠接受下一個請求。這樣就避免了重複的勞動,效率天然是高。並且當worker不夠用時,master能夠根據配置預先啓動幾個worker等着;固然空閒worker太多時,也會停掉一些,這樣就提升了性能,也節約了資源。這就是php-fpm的對進程的管理。php-fpm的管理對象是php-cgi

 

4、 PHP-FPM實現平滑重啓

 

1.         WorkerMan平滑重啓

WorkerMan分爲主進程和子進程,主進程負責監控子進程,子進程負責接收客戶端的鏈接和鏈接上發來的請求數據,作相應的處理並返回數據給客戶端。當業務代碼更新時,其實咱們只要更新子進程,即可以達到更新代碼的目的。

WorkerMan主進程收到平滑重啓信號時,主進程會向其中一個子進程發送安全退出(讓對應進程處理完畢當前請求後才退出)信號,當這個進程退出後,主進程會從新建立一個新的子進程(這個子進程載入了新的PHP代碼),而後主進程再次向另一箇舊的進程發送中止命令,這樣一個進程一個進程的重啓,直到全部舊的進程所有被置換爲止。

 

2.         Nginx平滑重啓

Nginx的進程分爲master主進程和work工做進程,master進程主要管理事件信號接受和分發,全部的請求處理都由work進程處理並返回結果,Nginx的平滑重啓或重載配置文件等升級,首先是向master發送重啓或重載配置文件信號,而後master告訴全部的work進程再也不接受新的請求,而後master另起新的work進程,最後告訴舊的work進程能夠光榮退出了。

 

3.         PHP-FPM平滑重啓

 php-fpm對此的處理機制是新的worker用新的配置,已經存在的worker處理完手上的活就能夠歇着了,經過這種機制來平滑過分。

 

5、 PHP-FPM詳解

 

PHP-FPM(PHP FastCGI Process Manager)意:PHP FastCGI 進程管理器,用於管理PHP 進程池的軟件,用於接受web服務器的請求。

PHP-FPM提供了更好的PHP進程管理方式,能夠有效控制內存和進程、能夠平滑重載PHP配置。

 

1.      爲何會出現php-fpm

fpm的出現是由於php-fastcgi出現,爲了很好的管理php-fastcgi而實現的一個程序。

 

2.      什麼是php-fastcgi

php-fastcgi 只是一個cgi程序,只會解析php請求,而且返回結果,不會管理(所以纔出現的php-fpm)

 

3.      爲何不叫php-cgi

其實在php-fastcgi出現以前是有一個php-cgi存在的,只是它的執行效率低下,所以被php-fastcgi取代。

 

4.      fastcgicgi有什麼區別

這區別就大了,當一個服務web-server(nginx)分發過來請求的時候,經過匹配後綴知道該請求是個動態的php請求,會把這個請求轉給php

cgi的年代,思想比較保守,老是一個請求過來後,去讀取php.ini裏的基礎配置信息,初始化執行環境,每次都要不停的去建立一個進程,讀取配置,初始化環境,返回數據,退出進程,長此以往,啓動進程的工做變的乏味無趣特別累。

php來到了5的時代,你們對這種工做方式特別反感,想偷懶的人就拼命的想,我可不可讓cgi一次啓動一個主進程(master),讓他只讀取一次配置,而後在啓動多個工做進程(worker),當一個請求來的時候,經過master傳遞給worker這樣就能夠避免重複勞動了。因而就產生了fastcgi

 

5.      fastcgi這麼好,啓動的worker用完怎麼辦

worker不夠的時候,master會經過配置裏的信息,動態啓動worker,等空閒的時候能夠收回worker

6.      到如今仍是沒明白php-fpm 是個什麼東西?

就是來管理啓動一個master進程和多個worker進程的程序。

 

PHP-FPM 會建立一個主進程,控制什麼時候以及如何將HTTP請求轉發給一個或多個子進程處理。PHP-FPM主進程還控制着何時建立(處理Web應用更多的流量)和銷燬(子進程運行時間過久或再也不須要了)PHP子進程。PHP-FPM進程池中的每一個進程存在的時間都比單個HTTP請求長,能夠處理1050100500或更多的HTTP請求。

 

6、 PHP-FPM安裝

 

PHP 5.3.3 以後已經把php-fpm併入到php的核心代碼中了。因此php-fpm不須要單獨的下載安裝。
要想php支持php-fpm,只須要在編譯php源碼的時候帶上 --enable-fpm 就能夠了。

 

7、 PHP-FPM配置

Centos中,PHP-FPM 的主配置文件是 /etc/php7/php-fpm.conf

指定一段時間內有指定個子進程失效了,PHP-FPM重啓:

 

相關文章
相關標籤/搜索