天天看點

webServer和PHP配合運作模式

關系圖

webServer和PHP配合運作模式

首先聊一下伺服器,常見的web server類型有apache和nginx

Apache工作模式

Apache的工作模式是Apache伺服器在系統啟動後,預先生成多個程序副本駐留在記憶體中,一旦有請求出現,就立即使用這些空餘的子程序進行處理,這樣就不存在生成子程序造成的延遲了。這些伺服器副本在處理完一次HTTP請求之後并不立即退出,而是停留在計算機中等待下次請求。對于客戶浏覽器的請求反應更快,性能較高。

Nginx工作模式

nginx有兩種工作模式:master-worker模式和單程序模式。在master-worker模式下,有一個master程序和至少一個的worker程序,單程序模式顧名思義隻有一個程序。這兩種模式有各自的特點和适用場景。

接下來就是Linux下php的三種運作模式了,APACHE2HANDLER 、CGI、FastCGI

APACHE2HANDLER是apache 自帶運作php的方式

CGI是比較老的模式了,這幾年都很少用了。cgi方式遇到連接配接請求先要建立cgi的子程序,然後處理請求,處理完後結束這個子程序。這就是fork-and-execute模式。是以用cgi方式的伺服器有多少連接配接請求就會有多少cgi子程序。子程序反複加載是cgi性能低下的主要原因。

FastCGI  FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行着,隻要激活後,不會每次都要花費時間去fork一次。PHP使用PHP-FPM(FastCGI Process Manager),全稱PHP FastCGI程序管理器進行管理。

FastCGI的工作原理:

(1)、Web Server啟動時載入FastCGI程序管理器(IIS ISAPI或Apache Module)

(2)、FastCGI程序管理器自身初始化,啟動多個CGI解釋器程序(可見多個php-cgi)并等待來自Web Server的連接配接。

(3)、當用戶端請求到達Web Server時,FastCGI程序管理器選擇并連接配接到一個CGI解釋器。Web server将CGI環境變量和标準輸入發送到FastCGI子程序php-cgi。

(4)、FastCGI子程序完成處理後将标準輸出和錯誤資訊從同一連接配接傳回Web Server。當FastCGI子程序關閉連接配接時,請求便告處理完成。FastCGI子程序接着等待并處理來自FastCGI程序管理器(運作在Web Server中)的下一個連接配接。 在CGI模式中,php-cgi在此便退出了。那什麼事php-cgi呢?

PHP-CGI

     PHP-CGI是PHP自帶的FastCGI管理器。可以對其直接啟動。現在不管是lighttpd還是nginx都可以與php-cgi進行組合運作php,其中lighttpd直接組合php-cgi運作php,還算比較穩定,筆者測試過,沒出現大的問題,效率都還可以。但nginx跟php-cgi直接組合運作php,這就是個噩夢了,php-cgi程序經常崩潰,而且占用的記憶體也比較高!這就留下了開篇的第二、第三問題,筆者現在還沒想清楚,有知道的請告知我,謝謝!

    PHP-CGI的不足

1)、php-cgi變更php.ini配置後需重新開機php-cgi才能讓新的php-ini生效,不可以平滑重新開機

2)、直接殺死php-cgi程序,php就不能運作了。(PHP-FPM和Spawn-FCGI就沒有這個問題,守護程序會平滑從新生成新的子程序。)

那麼什麼事PHP-FPM呢?

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-FPM來控制PHP-CGI的FastCGI程序

那麼什麼是Spawn-FCGI呢?

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搭配來解決動态網頁、

下面代碼是用Spawn-FCGI來控制php-CGI的FastCGI程序了

/usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u www-data -g www-data -f /usr/bin/php-CGI