Linux 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
Linux PHP的運行模式