面試-PHP篇-CGI、Fastcgi、PHP-FPM的詳細介紹與之間的關係

一:CGI是幹嘛的?CGI是爲了保證web server傳遞過來的數據是標準格式的

CGI(Common Gateway Interface),公共網關接口,它是Web服務器與外部應用程序(CGI程序)之間傳遞信息的接口標準。
如請求/index.html,那麼web server會去指定目錄下找到這個文件(如果存在的話)發送給瀏覽器,這裏分發的是靜態數據。那麼,請求的是/index.php的時候,根據配置文件,nginx知道這個不是靜態文件,需要去找PHP解析器來處理,那麼他會把這個請求簡單處理後交給PHP解析器。CGI就是規定客戶端向web server請求數據的時候,要傳哪些數據、以什麼樣的格式傳遞的一種協議。
通過CGI接口,Web服務器就能夠獲取客戶端提交的信息,並轉交給服務器端的CGI程序處理,最後返回結果給客戶端。一般地,我們提到的CGI實際上是實現了CGI接口標準的程序,用來處理客戶請求。CGI程序可以用C、perl、php等來編寫。

以前,web服務器一般只處理靜態的請求,如果碰到一個動態請求,web服務器會根據這次請求的內容,然後fork一個進程啓動CGI程序,這裏就是指PHP的解析器,PHP解析器程序啓動後,它就會解析php.ini文件,初始化執行環境,然後解析動態腳本,再把處理完的數據返回給web服務器,最後web服務器把內容發送給用戶,剛纔fork的進程也隨之退出。 如果下次用戶還請求改動態腳本,那麼web服務器又再次fork一個新的子進程啓動CGI程序,周而復始的進行。啓動CGI程序需要讀取配置文件、加載相關擴展等,這樣的工作效率非常低下。

二:CGI是個協議,跟進程什麼的沒關係;那fastcgi又是什麼呢?Fastcgi是用來提高CGI程序性能的

提高性能,那麼CGI程序的性能問題在哪呢?"PHP解析器會解析php.ini文件,初始化執行環境",就是這裏了。標準的CGI對每個請求都會執行這些步驟,所以處理

          每個時間的時間會比較長。這明顯不合理嘛!那麼Fastcgi是怎麼做的呢?首先,Fastcgi會先啓一個master,解析配置文件,初始化執行環境,然後再啓動多個worker。

          當請求過時,master會傳遞給一個worker,然後立即可以接受下一個請求。這樣就避免了重複的勞動,效率自然是高。而且當worker不夠用時,master可以根據配置預

          先啓動幾個worker等着;當然空閒worker太多時,也會停掉一些,這樣就提高了性能,也節約了資源。這就是fastcgi的對進程的管理。

(1)FastCGI是一種進程管理工具,它可以在內存中管理CGI進程。
(2)FastCGI就像是一個常駐(long-live)型的CGI程序,它可以一直運行着。
(3)FastCGI程序也可以和Web服務器分別部署在不同的主機上,它還可以接受來自其他Web服務器的請求。
(4)FastCGI也是語言無關的。其主要行爲是將CGI解釋器進程保持在內存中並因此獲得高效的性能。
(5)FastCGI進程管理器需要單獨啓動。啓動FastCGI後,會生成一個FastCGI主進程和多個子進程(子進程其實就是CGI解釋器進程)。
(6)當客戶端請求Web服務器上的動態腳本時,Web服務器會將動態腳本通過TCP協議交給FastCGI主進程,FastCGI主進程根據情況,安排一個空閒的子進程來解析動態腳本,處理完成後將結果返回給Web服務器,Web服務器再將結果返回給客戶端。該客戶端請求處理完畢後,FastCGI子進程並不會隨之關閉,而是繼續等待主進程安排工作任務。
 

三:那PHP-FPM又是什麼呢?是一個實現了Fastcgi的程序,被PHP官方收了

PHP-FPM(FastCGI Process Manager:FastCGI進程管理器)是一個實現了Fastcgi的程序,並且提供進程管理的功能,被PHP官方收了。
php-fpm就是php中的FastCGI進程管理器。進程包括master進程和worker進程。master進程只有一個,負責管理子進程(worker進程一般會有多個,每個進程中會嵌入一個PHP解析器,處理PHP代碼。
如果在Linux上搭建Nginx和PHP環境,則需要安裝PHP-FPM模塊,讓php以FastCGI的方式與nginx進行交互。
 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章