這篇文章介紹的內容是關於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
通用網關接口,外部程式與web伺服器之間的接口標準,是在cgi程式和web伺服器之間傳遞訊息的過程
每一次要求都會產生一個cgi進程,cgi程式執行完,進程退出
獨立於伺服器、獨立程式語言
FastCgi
#FastCgi 像是常駐型的Cgi,它可以一直執行這,只要啟動後,不需要每次去fork一次,也支援分散式運算,即FastCgi程式可以在網站伺服器以外的主機上執行並且接受來自其他網站伺服器的請求
可以同時處理多個請求
長期佔用記憶體
#php-cgi
php官方自帶的FastCGI 進程管理器
php.ini修改之後,必須kill掉php-cgi再啟動php.ini 才會生效。不可以平滑的重啟
記憶體不能動態分配
#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
linux查看nginx、apache、php、php-fpm、mysql及設定項目所在目錄
以上是cgi、fastcgi、php-cgi、php-fpm剖析的詳細內容。更多資訊請關注PHP中文網其他相關文章!