標籤:
原文地址:http://www.phpernote.com/news/723.html
做 php 開發的應該都知道 php 運行模式概念吧,本文將要和大家分享的是關於php目前比較常見的五大運行模式:包括cgi 、fast-cgi、cli、isapi、apache模組的DLL ,下面作者就這五大運行模式做一些自己的分析,有不對的地方,還請留言指正。
CGI運行模式
CGI即通用閘道介面(Common Gateway Interface),它是一段程式,通俗的講CGI就象是一座橋,把網頁和WEB伺服器中的執行程式串連起來,它把HTML接收的指令傳遞給伺服器的執行程式,再把伺服器執行程式的結果返還給HTML頁。CGI 的跨平台效能極佳,幾乎可以在任何作業系統上實現。
CGI方式在遇到串連請求(使用者 請求)先要建立cgi的子進程,啟用一個CGI進程,然後處理請求,處理完後結束這個子進程。這就是fork-and-execute模式。所以用cgi方式的伺服器有多少串連請求就會有多少cgi子進程,子進程反覆載入是cgi效能低下的主要原因。都會當使用者請求數量非常多時,會大量擠占系統的資源如內 存,CPU時間等,造成效能低下。
這種模式需要注釋掉LoadModule php5_module modules/libphp5.so 這行。如果不注釋這行會一直走到handler模式。也就是模組模式。然後在httpd.conf增加action:Action application/x-httpd-php /cgi-bin/php-cgi如果在/cgi-bin/目錄找不到php-cgi.可自行從php的bin裡面cp一個。然後重啟apache,再開啟測試頁面發現Server API變成:CGI/FastCGI。說明成功切換為cgi模式。
Fast-CGI運行模式
fast-cgi 是cgi的升級版本,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在此便退出了。
在上述情況中,你可以想象CGI通常有多慢。每一個Web請求PHP都必須重新解析php.ini、重新載入全部擴充並重初始化全部資料結構。使用FastCGI,所有這些都只在進程啟動時發生一次。一個額外的 好處是,持續資料庫連接(Persistent database connection)可以工作。
首先要添加fastcgi模組到httpd.conf設定檔:LoadModule fastcgi_module modules/mod_fastcgi.so 這種模式注釋不注釋LoadModule php5_module modules/libphp5.so這行貌似沒什麼關係,只要配置了以下模組<IfModule fastcgi_module> FastCgiServer /usr/local/apache/cgi-bin/php-cgi -processes 20 AddType application/x-httpd-php .php AddHandler php-fastcgi .php Action php-fastcgi /cgi-bin/php-cgi</IfModule>就會自動走到fastcgi模式。然後重啟apache,這個時候用 ps aux|grep php就會發現有很多php-cgi進程在運行。說明配置生效
cli運行模式
cli是php的命令列運行模式,大家經常會使用它,但是可能並沒有注意到(例如:我們在linux下經常使用 “php -m”尋找PHP安裝了那些擴充就是PHP命令列運行模式;有興趣的同學可以輸入php -h去深入研究該運行模式)
ISAPI運行模式
ISAPI即Internet Server Application Program Interface,是微軟提供的一套面向Internet服務的API介面,一個ISAPI的DLL,可以在被使用者請求啟用後長駐記憶體,等待使用者的另一個請求,還可以在一個DLL裡設定多個使用者請求處理函數,此外,ISAPI的DLL應用程式和WWW伺服器處於同一個進程中,效率要顯著高於CGI。(由於微軟的排他性,只能運行於windows環境)
APACHE2HANDLER
PHP作為Apache模組,Apache伺服器在系統啟動後,預先產生多個進程副本駐留在記憶體中,一旦有請求出現,就立即使用這些空餘的子進程進行處理,這樣就不存在產生子進程造成的延遲了。這些伺服器複本在處理完一次HTTP請求之後並不立即退出,而是停留在電腦中等待下次請求。對於客戶瀏覽器的請求反應更快,效能較高。
apache模組的DLL運行模式
此運行模式是我們以前在windows環境下使用apache伺服器經常使用的,而在模組化(DLL)中,PHP是與Web伺服器一起啟動並啟動並執行。(是apache在CGI的基礎上進行的一種擴充,加快PHP的運行效率)
對於以上每種運行模式都有自己的優缺點,沒有絕對的好與壞,主要是看大家在什麼環境下面有什麼樣的需求了。
這種模式最簡單,在http.conf中增加LoadModule php5_module modules/libphp5.so即可。然後在<IfModule mime_module>AddType application/x-httpd-php .phpAddType applicaiton/x-httpd-php-source .phps
php五大運行模式CGI,FAST-CGI,CLI,ISAPI,APACHE模式淺談