CGI FastCGI PHP-CGI PHP-FRM

CGI(Common GateWay Interface )通用網關接口,CGI可讓一個客戶端,從網頁瀏覽器向執行在Web服務器上的程序請求數據。CGI描述了客戶端和這個程序之間傳輸數據的一種協議標準php

CGI的運行原理nginx

1:客戶端訪問某個URL地址以後,經過get/post/put等方式提交數據,並經過HTTP協議向web服務器發出請求web

2:服務器端的守護進程(http Demon)啓動一個子進程。而後子進程將http請求裏描述的信息經過標準輸入stdin和環境變量傳遞給URL指定的CGI程序,並啓動此CGI程序進行處理api

處理的結果經過標準輸出stdout返回給HTTP Demon子進程瀏覽器

3: HTTP Daemon 子進程經過 HTTP 協議返回給客戶端服務器

 

FastCGI 是web服務器和處理程序之間通訊的一種協議,是CGI的改進版FastCGI像是一個常駐(long-lived)型的CGI,它能夠一直執行,在請求到達時不會花費時間去fork一個進程socket

來處理(這是CGI最爲人詬病的fork-and-execute模式)分佈式

FastCGI 工做流程以下

1:FastCGI進程管理器自身初始化,啓動多個CGI解釋器進程,並等待來自Web Server的鏈接php-fpm

2:Web服務器與FastCGI進程管理器進行socket通訊,經過FastCGI協議發送CGI環境變量和標準輸入數據給CGI解釋器post

3:CGI解釋器進程完成處理後將標準輸出和錯誤信息從同一個鏈接返回Web Server

4:CGI解釋器進程接着等待並處理來自Web Server的下一個鏈接

 

 

FastCGI與傳統CGI模式的區別之一則是web服務器不是直接執行CGI程序,而是經過Socket與FastCGI進程管理器進行交互,也正是因爲FastCGI進程管理器是基於Socket

通訊的因此也是分佈式的

PHP中的CGI實現

php的CGI實現了FastCGI協議,是一個TCP或UDP協議的服務器接受來自Web服務器的請求,當啓動時建立TCP/UDP協議的服務器socket監聽,並接收相關請求進行處理。隨後進入了php的生命週期:模塊初始化、sapi初始化、處理PHP請求、模塊關閉、sapi關閉等構成了CGI生命週期。

 

PHP-CGI

PHP-CGI 是PHP自帶的FastCGI管理器

PHP-CGI的不足:

  1. php-cgi變動php.ini配置後需重啓php-cgi才能讓新的php-ini生效,不能夠平滑重啓。
  2. 直接殺死php-cgi進程,php就不能運行了。(PHP-FPM和Spawn-FCGI就沒有這個問題,守護進程會平滑重新生成新的子進程。)

PHP-FPM

PHP-FPM是一個PHP FastCGI管理器,是隻用於PHP的,能夠在 http://php-fpm.org/download下載獲得。

PHP-FPM實際上是PHP源代碼的一個補丁,旨在將FastCGI進程管理整合進PHP包中。必須將它patch到你的PHP源代碼中,在編譯安裝PHP後纔可使用。

如今咱們能夠在最新的PHP 5.3.2的源碼樹裏下載獲得直接整合了PHP-FPM的分支,聽說下個版本會融合進PHP的主分支去。相對Spawn-FCGI,PHP-FPM在CPU和內存方面的控制都更勝一籌,並且前者很容易崩潰,必須用crontab進行監控,而PHP-FPM則沒有這種煩惱。

PHP5.3.3已經集成php-fpm了,再也不是第三方的包了。PHP-FPM提供了更好的PHP進程管理方式,能夠有效控制內存和進程、能夠平滑重載PHP配置,比spawn-fcgi具備更多有點,因此被PHP官方收錄了。在./configure的時候帶 –enable-fpm參數便可開啓PHP-FPM。

PHP的解釋器是php-cgi。php-cgi只是個CGI程序,他本身自己只能解析請求,返回結果,不會進程管理(皇上,臣妾真的作不到啊!)因此就出現了一些可以調度php-cgi進程的程序,好比說由lighthttpd分離出來的spawn-fcgi。好了PHP-FPM也是這麼個東東,在長時間的發展後,逐漸獲得了你們的承認(要知道,前幾年你們但是抱怨PHP-FPM穩定性太差的),也愈來愈流行。

Spawn-FCGI

Spawn-FCGI是一個通用的FastCGI管理服務器,它是lighttpd中的一部份,不少人都用Lighttpd的Spawn-FCGI進行FastCGI模式下的管理工做,不過有很多缺點。而PHP-FPM的出現多少緩解了一些問題,但PHP-FPM有個缺點就是要從新編譯,這對於一些已經運行的環境可能有不小的風險(refer),在php 5.3.3中能夠直接使用PHP-FPM了。

Spawn-FCGI目前已經獨成爲一個項目,更加穩定一些,也給不少Web 站點的配置帶來便利。已經有很多站點將它與nginx搭配來解決動態網頁。

最新的lighttpd也沒有包含這一塊了(http://www.lighttpd.net/search?q=Spawn-FCGI),但能夠在之前版本中找到它。在lighttpd-1.4.15版本中就包含了(http://www.lighttpd.net/download/lighttpd-1.4.15.tar.gz),目前Spawn-FCGI的下載地址是http://redmine.lighttpd.net/projects/spawn-fcgi,最新版本是http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz。

注:最新的Spawn-FCGI能夠到lighttpd.net網站搜索「Spawn-FCGI」找到它的最新版本發佈地址。

PHP-FPM與spawn-CGI對比

PHP-FPM的使用很是方便,配置都是在PHP-FPM.ini的文件內,而啓動、重啓均可以從php/sbin/PHP-FPM中進行。更方便的是修改php.ini後能夠直接使用PHP-FPM reload進行加載,無需殺掉進程就能夠完成php.ini的修改加載結果顯示使用PHP-FPM可使php有不小的性能提高。PHP-FPM控制的進程cpu回收的速度比較慢,內存分配的很均勻。Spawn-FCGI控制的進程CPU降低的很快,而內存分配的比較不均勻。有不少進程彷佛未分配到,而另一些卻佔用很高。多是因爲進程任務分配的不均勻致使的。而這也致使了整體響應速度的降低。而PHP-FPM合理的分配,致使整體響應的提到以及任務的平均。

相關文章
相關標籤/搜索