首頁  >  文章  >  後端開發  >  cgi、fastcgi、php-cgi、php-fpm剖析

cgi、fastcgi、php-cgi、php-fpm剖析

不言
不言原創
2018-04-20 10:52:451473瀏覽

這篇文章介紹的內容是關於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

  • ##非官方fastCgi進程管理器,後來php5.4開始,被官方收錄了,編譯php的時候只要–enable-fpm 就可以開啟php-fpm

  • 可以平滑重啟php

  • 動態調度進程





##### ##############Nginx只負責反向代理/請求轉發,不負責管理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


相關推薦:

CGI、FastCGI和PHP-FPM關係圖解

linux查看nginx、apache、php、php-fpm、mysql及設定項目所在目錄

以上是cgi、fastcgi、php-cgi、php-fpm剖析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn