這篇文章介紹的內容是關於cgi、fastcgi、php-cgi、php-fpm剖析,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
定義
首先,CGI是幹嘛的?CGI是為了保證web server傳遞過來的資料是標準格式的,方便CGI程式的編寫者。
web server(比如說nginx)只是內容的分發者。比如,如果請求/index.html,那麼web server會去檔案系統中找到這個檔案,發送給瀏覽器,這裡分發的是待用資料。好了,如果現在請求的是/index.php,根據設定檔,nginx知道這個不是靜態檔案,需要去找PHP解析器來處理,那麼他會把這個請求簡單處理後交給PHP解析器。Nginx會傳哪些資料給PHP解析器呢?url要有吧,查詢字串也得有吧,POST資料也要有,HTTP header不能少吧,好的,CGI就是規定要傳哪些資料、以什麼樣的格式傳遞給後方處理這個請求的協議。仔細想想,你在PHP代碼中使用的使用者從哪裡來的。
當web server收到/index.php這個請求後,會啟動對應的CGI程式,這裡就是PHP的解析器。接下來PHP解析器會解析php.ini檔案,初始化執行環境,然後處理請求,再以規定CGI規定的格式返回處理後的結果,退出進程。web server再把結果返回給瀏覽器。
好了,CGI是個協議,跟進程什麼的沒關係。那fastcgi又是什麼呢?Fastcgi是用來提高CGI程式效能的。
提高效能,那麼CGI程式的效能問題在哪呢?"PHP解析器會解析php.ini檔案,初始化執行環境",就是這裡了。標準的CGI對每個請求都會執行這些步驟(不閑累啊!啟動進程很累的說!),所以處理每個時間的時間會比較長。這明顯不合理嘛!那麼Fastcgi是怎麼做的呢?首先,Fastcgi會先啟一個master,解析設定檔,初始化執行環境,然後再啟動多個worker。當請求過來時,master會傳遞給一個worker,然後立即可以接受下一個請求。這樣就避免了重複的勞動,效率自然是高。而且當worker不夠用時,master可以根據配置預先啟動幾個worker等著;當然空閑worker太多時,也會停掉一些,這樣就提高了效能,也節約了資源。這就是fastcgi的對進程的管理。
cgi
FastCgi
php-cgi
php-fpm
Nginx只負責反向 Proxy/請求轉寄,不負責管理php-cgi進程,所以Nginx一般配合能夠自行管理背景工作處理序(子進程)的php-fpm使用.
需要注意的是,php-fpm是一個獨立的SAPI,其管理的不是php-cgi,也就是說php-fpm跟php-cgi無關,php-fpm內建php解譯器,php-fpm的子進程是自己fork出來的,並不會調用php-cgi,你把系統中的php-cgi刪了也不會影響到php-fpm服務的正常運行.
php-fpm在pm = static配置下背景工作處理序常駐後台,也就是如果你配置了5個背景工作處理序pm.max_children = 5,那php-fpm服務啟動時就會自動fork出5個子進程並常駐後台,不會在請求處理結束後退出,也不會在空閑時退出.如果你在php指令碼中使用了資料庫持久串連,這時這5個背景工作處理序還會建立並維持5個到資料庫的持久串連,實現在處理多個請求的時候重用資料庫連接資源,避免每個請求都建立/釋放一次資料庫連接.持久串連還能做到逾時自動重連,對php-fpm裡的指令碼來說是完全透明的,指令碼只需在啟動時指明使用持久串連即可.
php-fpm在pm = dynamic配置下背景工作處理序【部分】常駐後台,也就是維持一定數量的常駐進程,服務繁忙時fork出更多的進程,服務閑置時自動關掉一些進程,把記憶體資源歸還給作業系統.虛擬機器主機供應商應該是比較喜歡這種方式的.
總而言之,PHP-FPM這種運行模式類似於Apache的prefork MPM,能靜能動的多進程網路服務.
php-cgi是早期php官方出品的fastcgi管理器,不支援平滑重啟,改了php.ini就要kill掉原來的php-cgi再重新啟動才會生效;不支援動態worker調度,只能一開始指定要起幾個worker。
php-fpm是從5.3.3才加入的fastcgi進程管理器,加入了動態調度功能,可以根據請求來訪壓力變化動態增減worker進程數量;支援reload指令,讓worker進程在完成當前請求後重啟,並應用php.ini新配置。
php54是之前是一種關係,php54之後另一種關係。
php54之前,php-fpm(第三方編譯)是管理器,php-cgi是解譯器
php54之後,php-fpm(官方內建),master 與 pool 模式。php-fpm 和 php-cgi 沒有關係了。php-fpm又是解譯器,又是管理器
參考網站https://www.zhihu.com/question/55835080
https://segmentfault.com/q/1010000000256516