理解CGI、FCGI、php-cgi、php-fpm的概念

CGI:common gateway interface 通用網關接口

FCGI:fast common gateway interface 快速通用網關接口

PHP-FPM:PHP-Fast CGI Process Manager

php-cgi是CGI協議的實現,PHP-FPM是FCGI協議的實現。

CGI 就是web服務器如nginx跟後端動態腳本語言如PHP通信的協議接口。

1.場景:

瀏覽器請求web服務器如nginx,如果請求的是靜態的index.html,則nginx可以直接返回。但是如果請求的是idex.php,nginx根據配置發現不是靜態資源,需要請求後端的服務。那麼,nginx在請求後端服務時,需要以什麼樣的格式、發送給後端服務什麼樣的數據呢?CGI就是定義格式、數據的協議。

2.CGI協議的缺點:

CGI協議每次在請求後端服務時都要啓動實現CGI協議的程序,這裏就是PHP解析器。PHP解析器會解析PHP.ini文件,進行初始化工作,處理請求、返回結果。每個請求都要重新初始化,工作太冗餘。所以,FCGI應運而生。 
因爲PHP是解釋型語言,因此需要解釋器去解釋PHP代碼。

3.FCGI的優點:

FCGI協議首先啓動一個master,master用來解析PHP.ini文件,進行初始化工作。啓動多個worker,worker用來處理具體的請求。這樣將初始化和處理具體的請求就分離了。這樣也就需要一個程序來管理master和worker,所以PHP-FPM就出現了。

FCGI採用C/S架構。將web服務器與腳本解析服務器分離開來。使得web服務器只處理靜態資源和將後端腳本解析服務器返回的數據返回給瀏覽器。

web服務器nginx不支持對外部程序如PHP程序的直接調用或者解析,因此必須通過CGI接口來調用。這是其實需要將CGI進行一個封裝,形成一個wrapper,其實就是PHP-FPM。nginx調用PHP-FPM,PHP-FPM再調用後端的PHP代碼,然後PHP-FPM返回結果給nginx。

現在PHP-FPM已經被集成到PHP內核中。

PHP-FPM與nginx經常會部署在不同服務器上,以減輕前端nginx處理靜態資源,轉發動態請求的壓力。

而且FCGI也比CGI要安全。

4.CGI協議的實現PHP-CGI

如果修改了php.ini文件,PHP-CGI是無法平滑過渡的。也就是,必須要重啓PHP-CGI程序才能使用這些新的配置。

5.FCGI協議的實現PHP-FPM

如果修改了php.ini文件,PHP-FPM可以實現平滑過渡。對於修改之前的worker,當處理完這次請求之後,會對其進行銷燬,新生成的worker可以使用新的配置。這樣也就實現了平滑過渡。 
而且,如果PHP-CGI進程掛了,PHP也就不能運行了。PHP-FPM沒有這個問題,守護進程會平滑重新啓動一個子進程。

PHP-FPM在出現之前,其實有個從lighthttpd發展來的spawn-fcgi。PHP-FPM可以在初始化時創建多個worker,當有worker空閒時,可以對worker進行回收。

spawn-fcgi在高併發時會出現內存泄漏、甚至自動重啓FCGI的問題。

參考鏈接:

http://www.cnblogs.com/JohnABC/p/3529786.html

https://segmentfault.com/q/1010000000256516

http://www.cleey.com/blog/single/id/848.html

http://m.blog.csdn.net/article/details?id=8740914

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