天天看點

php的運作原理、cgi對比fastcgi以及php-cgi和php-fpm之間的聯系差別

要了解php的運作原理,首先要了解下面幾個概念:

CGI:

CGI的英文是(COMMON GATEWAY INTERFACE)公共網關接口,它的作用就是幫助伺服器與語言通信,這裡就是nginx和php進行通信,因為nginx和php的語言不通,是以需要一個溝通轉換的過程,而CGI就是這個溝通的協定。

nginx伺服器在接受到浏覽器傳遞過來的資料後,如果請求的是靜态的頁面或者圖檔等無需動态處理的則會直接根據請求的url找到其位置然後傳回給浏覽器,這裡無需php參與,但是如果是一個動态的頁面請求,這個時候nginx就必須與php通信,這個時候就會需要用到cgi協定,将請求資料轉換成php能了解的資訊,然後php根據這些資訊傳回的資訊也要通過cgi協定轉換成nginx可以了解的資訊,最後nginx接到這些資訊再傳回給浏覽器。

fast-cgi:

傳統的cgi協定在每次連接配接請求時,會開啟一個程序進行處理,處理完畢會關閉該程序,是以下次連接配接,又要再次開啟一個程序進行處理,是以有多少個連接配接就有多少個cgi程序,這也就是為什麼傳統的cgi會顯得緩慢的原因,是以過多的程序會消耗資源和記憶體。

而fast-cgi則是一個程序可以處理多個請求,和上面的cgi協定完全不一樣,cgi是一個程序隻能處理一個請求,這樣就會導緻大量的cgi程式,是以會給伺服器帶來負擔。

php-cgi:

php-cgi是php提供給web serve也就是http前端伺服器的cgi協定接口程式,當每次接到http前端伺服器的請求都會開啟一個php-cgi程序進行處理,而且開啟的php-cgi的過程中會先要重載配置,資料結構以及初始化運作環境,如果更新了php配置,那麼就需要重新開機php-cgi才能生效,例如phpstudy就是這種情況。

php-fpm:

php-fpm是php提供給web serve也就是http前端伺服器的fastcgi協定接口程式,它不會像php-cgi一樣每次連接配接都會重新開啟一個程序,處理完請求又關閉這個程序,而是允許一個程序對多個連接配接進行處理,而不會立即關閉這個程序,而是會接着處理下一個連接配接。它可以說是php-cgi的一個管理程式,是對php-cgi的改進。

php-fpm會開啟多個php-cgi程式,并且php-fpm常駐記憶體,每次web serve伺服器發送連接配接過來的時候,php-fpm将連接配接資訊配置設定給下面其中的一個子程式php-cgi進行處理,處理完畢這個php-cgi并不會關閉,而是繼續等待下一個連接配接,這也是fast-cgi加速的原理,但是由于php-fpm是多程序的,而一個php-cgi基本消耗7-25M記憶體,是以如果連接配接過多就會導緻記憶體消耗過大,引發一些問題,例如nginx裡的502錯誤。

同時php-fpm還附帶一些其他的功能:

例如平滑過渡配置更改,普通的php-cgi在每次更改配置後,需要重新啟動才能初始化新的配置,而php-fpm是不需要,php-fpm分将新的連接配接發送給新的子程式php-cgi,這個時候加載的是新的配置,而原先正在運作的php-cgi還是使用的原先的配置,等到這個連接配接後下一次連接配接的時候會使用新的配置初始化,這就是平滑過渡。

可能上面文字叙述很難了解,下面用圖形來簡要的說明浏覽器請求web伺服器的過程、cgi以及fastcgi,以及php-cgi和php-fpm之間的差別和聯系:

php的運作原理、cgi對比fastcgi以及php-cgi和php-fpm之間的聯系差別
php的運作原理、cgi對比fastcgi以及php-cgi和php-fpm之間的聯系差別

上面是使用php-fpm的動态頁面的過程,下面補充沒有普通cgi協定的情況;

php的運作原理、cgi對比fastcgi以及php-cgi和php-fpm之間的聯系差別

這裡的web server可以是nginx,也可以是IIS和apache等http伺服器,也可以成為網站伺服器或者前端伺服器。

原文連結:https://blog.csdn.net/belen_xue/article/details/65950658

php