對於cgi fastcgi php-fpm php-cgi的解釋,網上挺多的,能夠百度查看,下面是我本身的理解php
名詞術語:web
一、web服務器 二、通訊協議 三、進程、主進程、子進程 四、php解析器 CGI:Common Gateway Interface 公共網關接口,web服務器和腳本語言通訊的一個標準、 接口、協議【協議】 FastCGI:CGI協議的升級版【協議】 PHP-CGI: 實現了CGI接口協議的PHP腳本解析器【程序】 PHP-FPM: 管理和調度php-cgi進程,進而實現了FastCGI接口協議的程序【程序】
webserver只能處理靜態文件,對於php這樣的動態腳本無能爲力,只能交給php本身來處理, 因而有了下面這個流程:
可是上面架構有個性能問題,CGI對每一個請求會parse一遍對應腳本的配置文件(如php.ini), 加載配置和擴展,初始化執行環境,性能很是差,全部有了下面的流程:
那麼實現Fastcgi協議的程序,如PHP-FPM是怎麼作的呢?首先,Fastcgi會先啓一個master進程,解析配置文件,初始化執行環境,而後再啓動多個worker進程,這個worker就是php-cgi。當請求過來時,master會傳遞給一個worker,而後當即能夠接受下一個請求。這樣就避免了重複的勞動,效率天然是高。並且當worker不夠用時,master能夠根據配置預先啓動幾個worker等着,好比20worker,固然空閒worker太多時,也會停掉一些,這樣就提升了性能,也節約了資源。這就是fastcgi的對進程的管理。segmentfault
下面是php-fpm配置文件裏面的對worker數量的配置項:服務器
; The maximum number of processes FPM will fork. This has been design to control ; the global number of processes when using dynamic PM within a lot of pools. ; Use it with caution. ; Note: A value of 0 indicates no limit ; Default Value: 0 ; process.max = 128
那麼最大的worker進程數就是128架構
更多的對FastCGI的解釋php-fpm
fastcgi是基於cgi架構的擴展,他的核心思想就是在web server和具體cgi程序之間創建一個智能的可持續的中間層,統管cgi程序的運行,這樣web server只須要將請求提交給這個層,這個層再派生出幾個可複用的cgi程序實例,而後再把請求分發給這些實例,這些實例是可控的,可持續,可複用的,所以一方面避免了進程反覆fork,另外一方面又能夠經過中間層的控制和探測機制來監視這些實例的運行狀況,根據不一樣的情況fork或者回收實例,達到靈活性和穩定性兼得的目的。
參考文檔性能
https://segmentfault.com/q/1010000000256516spa
http://blog.csdn.net/zhuanshenweiliu/article/details/46413241.net