1、FastCGI是什麼?
FastCGI是語言無關的、可伸縮架構的CGI開放擴展,其主要行爲是將CGI解釋器進程保持在內存中並所以獲 得較高的性能。衆所周知,CGI解釋器的反覆加載是CGI性能低下的主要緣由,若是CGI解釋器保持在內存中並接受FastCGI進程管理器調度,則能夠 提供良好的性能、伸縮性、Fail- Over特性等等。
FastCGI的官方站點在
http://www.fastcgi.com
FastCGI的工做原理是:
一、Web Server 啓動時載入FastCGI進程管理器(IIS ISAPI或Apache Module);
二、FastCGI進程管理器自身初始化,啓動多個CGI解釋器進程 (在任務管理器中可見多個php-cgi.exe)並等待來自Web Server的鏈接。
三、當客戶端請求到達Web Server時,FastCGI進程管理器選擇並鏈接到一個CGI解釋器。Web server將CGI環境變量和標準輸入發送到FastCGI子進程php-cgi.exe。
四、FastCGI子進程完成處理後將標準輸出和錯誤信息從同一鏈接返回Web Server。當FastCGI子進程關閉鏈接時,請求便告處理完成。FastCGI子進程接着等待並處理來自FastCGI進程管理器(運行在 WebServer中)的下一個鏈接。 在正常的CGI模式中,php-cgi.exe在此便退出了。
在上述狀況中,你能夠想象 CGI一般有多慢。每個Web請求PHP都必須從新解析php.ini、從新載入所有dll擴展並重初始化所有數據結構。使用FastCGI,全部這些 都只在進程啓動時發生一次。一個額外的好處是,持續數據庫鏈接(Persistent database connection)能夠工做。
2、爲何要使用FastCGI,而不是多線程CGI解釋器?
這可能出於多方面的考慮,例如:
一、你不管如何也不能在windows平臺上穩定的使用多線程CGI解釋器,不管是IIS ISAPI方式仍是APACHE Module方式,它們老是運行一段時間就崩潰了。奇怪麼?可是確實存在這樣的狀況!
固然,也有不少時候你可以穩定的使用多線程CGI解釋器,可是,你有可能發現網頁有時候會出現錯誤,不管如何也找不到緣由,而換用FastCGI方式時 這種錯誤的機率會大大的下降。我也不清楚這是爲何,我想獨立地址空間的CGI解釋器可能終究比共享地址空間的形式來得穩定一點點。
二、性 能!性能?可能麼,難道FastCGI比多線程CGI解釋器更快?但有時候確實是這樣,只有測試一下你的網站,才能最後下結論。緣由嘛,我以爲很難講,但 有資料說在Zend WinEnabler的時代,Zend原來也是建議在Windows平臺下使用FastCGI而不是IIS ISAPI或Apache Module,不過如今Zend已經不作這個產品了。
3、不使用FastCGI的理由
一、多進程比多線程消耗更多的服務器內存,php-cgi.exe解釋器每進程消耗7至25兆內存,將這個數字乘以50或100試試。
二、性能。確實有時候多線程CGI解釋器更快,呵呵,並且有時候,它也很穩定。
三、CGI?聽起來就很土,呵呵
4、IIS FastCGI配置方法
一、首先肯定你已正確安裝了PHP 4.3.x及更新的版本。早期版本的PHP並未默認加入FastCGI支持,若是你想在早期版本中工做,須要從新編譯它。咱們假設PHP安裝在c:/php,支持FastFCGI的可執行文件名是php-cgi.exe。
注意:建議在Php.ini中關閉cgi.force_redirect,啓用fastcgi.impersonate,啓用cgi.rfc2616_header
二、
下載
http://www.caraveo.com/fastcgi/fastcgi-0.6.zip並將其中的isapi_fcgi.dll解壓縮到c:/php目錄下(不是必須在此目錄,這裏只是敘述方便)。
三、使用regedit.exe創建以下注冊表項:
HKEY_LOCAL_MACHINE:Software/FASTCGI/.php (必需)
四、在此項下創建以下鍵值:
字符串類型:AppPath,值爲c:/php/php-cgi.exe (必需)
字符串類型:BindPath,值爲php-fcgi (必需)
如下是可選配置鍵值:
DWORD類型:StartServers,啓動時默認啓動的解釋器個數,默認值5
DWORD類型:MaxServers,最大解釋器個數,默認25
DWORD類型:IncrementServers,當解釋器不夠用時增量個數,默認2
DWORD類型:Timeout,增量解釋器(超出StartServers數目的)存活時間,默認600(秒)
DWORD類型:ThreadPoolSize,線程池大小,僅IIS下有效,默認10
DWORD類型:Impersonate,僅IIS有效,若是爲1,使用IIS安全標誌,爲0則關閉此特性。不要關閉它除非你不擔憂安全問題。默認1
DWORD類型:MaxPostData,Post數據預讀Byte限制,默認0
DWORD類型:BypassAuth,僅IIS有效,若是爲1而且isapi_fcgi.dll被配置爲IIS Filter,同時IIS被配置爲使用BASIC Authentication,這將強制全部認證請求使用IIS匿名用戶。這一選項的目的是容許腳本實現本身的安全機制。默認0
BINARY類型:CustomVars,附加環境變量值,新行分隔,Null結束
五、若是是IIS6,添加一個Web服務擴展指向c:/php/isapi_fcgi.dll,並容許。應用程序池中的「最大工做進程數」請保持爲1。
六、添加應用程序擴展映射關係:
1). 在Internet信息服務管理器中,選擇網站或應用程序的根目錄。
2). 打開目錄屬性頁(右鍵選擇「屬性」),再選擇「主目錄」。
3). 點擊「配置」按鈕,選擇「映射」Tab頁。
4). 點擊「添加...」,在「可執行文件」設爲: c:/php/isapi_fcgi.dll,擴展名設爲.php,必定要選擇「確認文件是否存在」,而後「肯定」保存設置。
5). 再一樣添加對.php3或.phtml擴展名的支持(可選)。
6). 保存設定並從新啓動IIS。
七、測試一下,同時請求多個Web頁面,而後察看任務管理器中的進程,頁面完成後php-cgi.exe進程持續運行並不退出。
5、Apache配置方法
一、首先肯定你已正確安裝了PHP 4.3.x及更新的版本。早期版本的PHP並未默認加入FastCGI支持,若是你想在早期版本中工做,須要從新編譯它。咱們假設PHP安裝在c:/php,支持FastFCGI的可執行文件名是php-cgi.exe。
注意:建議在Php.ini中打開cgi.force_redirect,關閉fastcgi.impersonate,關閉cgi.rfc2616_headers。
二、下載
http://www.fastcgi.com/dist/mod_fastcgi-2.4.2-AP20.dll,放到Apache 2.x的Modules目錄中。 三、肯定Apache 2.x在CGI方式下能夠正常運行PHP。httpd.conf中存在以下幾行: ScriptAlias /php/ "c:/php/" Action application/x-httpd-php "/php/php-cgi.exe" SetEnv PHPRC "C:/php" AddType application/x-httpd-php .php 四、在httpd.conf中添加: LoadModule fastcgi_module modules/mod_fastcgi-2.4.2-AP20.dll # 說明:此處的 -processes 3 表示啓動三個 php-cgi.exe 進程, # 關於 FastCgiServer 的詳細參數請參考 FastCGI 文檔。 FastCgiServer "c:/php/php-cgi.exe" -processes 3 五、從新啓動Apache,測試同上。 6、高級配置 設想這樣一種場景,你的服務器上同時跑Apache 2和IIS 6,兩個Web服務器都跑php應用。那麼,有以下三種可能: A、php使用iis isapi和apache module安裝,均爲多線程方式運行。這個和FastCGI沒有關係。 B、其中一個服務器使用FastCGI方式,另外一個使用多線程方式。這個能運行正常。 C、兩個均使用FastCGI方式,這個每每不正常。通常表現爲: 兩個服務器各自啓動一些php-cgi.exe進程,而後服務器之一不解釋php頁面,或者隔一下子就派生新的php-cgi.exe進程(可怕呀)。 爲何呢?我想大概是由於上面使用的兩個東西(iis isapi和apache module)的做者大概並無想過要和對方同時使用吧,呵呵。想了想,Apache 2和IIS 6若是能夠共用一批php-cgi.exe解釋器就行了,既不浪費內存,估計也不會有調度問題了。 通過研究和測試證實,這個想法是可行的。但 是,因爲Shane Caraveo並未在ISAPI DLL中提供使用外置FastCGI服務的功能,所以在此場景中只能是由IIS負責啓動和管理php-cgi.exe,而後配置Apache去使用這些受 IIS管理的php-cgi.exe進程。 配置方法: 一、按上述四中的方法配置IIS FastCGI。 二、基本按上述五中的方法配置Apache FastCGI,五.4改成在httpd.conf中添加: LoadModule fastcgi_module modules/mod_fastcgi-2.4.2-AP20.dll # 使用外部FastCGI服務器,請參考 FastCGI 文檔。 FastCgiExternalServer "c:/php/php-cgi.exe" -socket "php-fcgi" 注意:-socket參數後的值必須與HKEY_LOCAL_MACHINE:Software/FASTCGI/.php中BindPath的值一致,這樣兩個FastCGI進程管理器纔會使用同一個命名管道鏈接php-cgi.exe。 注意:此配置中php-cgi.exe進程只受IIS中的FastCGI進程管理器管理, Apache的繁忙請求並不會使IIS中的FastCGI調度更多的php-cgi.exe進程。所以,在IIS中配置FastCGI時應當使 StartServers值足夠大,以免php解釋器數量不足。一樣帶來的問題是,若是IIS關閉了,那麼Apache就會找不到Php解釋器了,這個 要留心。 由此帶來的一個問題是:此時的php.ini中cgi.force_redirect、fastcgi.impersonate、cgi.rfc2616_headers應該怎麼設定呢?這個留給你們去思考吧……呵呵 另一個可能遇到的問題是,IIS很是空閒,一段時間後由IIS啓動的php-cgi.exe退出了,則apache就解釋不了 Php了,怎麼辦呢?這時能夠訪問一下iis網站,php-cgi.exe就又起來了,暈哦。一個建議是使用IIS 6的進程池管理,在應用程序池中關掉「空閒超時」,而且,在「應用程序池標識」中將運行帳號設定爲與Apache服務啓動帳號一致。