一、FastCGI是什么?
FastCGI是語言無關(guān)的、可伸縮架構(gòu)的CGI開放擴(kuò)展,其主要 行為是將CGI解釋器進(jìn)程保持在內(nèi)存中并因此獲得較高的性能。眾所周知,CGI解釋器的反復(fù)加載是CGI性能低下的主要原因,如果CGI解釋器保持在內(nèi)存 中并接受FastCGI進(jìn)程管理器調(diào)度,則可以提供良好的性能、伸縮性、Fail-Over特性等等。
FastCGI的官方站點(diǎn)在
FastCGI的工作原理是:
1、Web Server 啟動時載入FastCGI進(jìn)程管理器(IIS ISAPI或Apache Module);
2、FastCGI進(jìn)程管理器自身初始化,啟動多個CGI解釋器進(jìn)程 (在任務(wù)管理器中可見多個php-cgi.exe)并等待來自Web Server的連接。
3、當(dāng)客戶端請求到達(dá)Web Server時,F(xiàn)astCGI進(jìn)程管理器選擇并連接到一個CGI解釋器。Web server將CGI環(huán)境變量和標(biāo)準(zhǔn)輸入發(fā)送到FastCGI子進(jìn)程php-cgi.exe。
4、FastCGI子進(jìn)程完成處理后將標(biāo)準(zhǔn)輸出和錯誤信息從同一連接返回Web Server。當(dāng)FastCGI子進(jìn)程關(guān)閉連接時,請求便告處理完成。FastCGI子進(jìn)程接著等待并處理來自FastCGI進(jìn)程管理器(運(yùn)行在 WebServer中)的下一個連接。 在正常的CGI模式中,php-cgi.exe在此便退出了。
在上述情況中,你可以想象 CGI通常有多慢。每一個Web請求PHP都必須重新解析php.ini、重新載入全部dll擴(kuò)展并重初始化全部數(shù)據(jù)結(jié)構(gòu)。使用FastCGI,所有這些 都只在進(jìn)程啟動時發(fā)生一次。一個額外的好處是,持續(xù)數(shù)據(jù)庫連接(Persistent database connection)可以工作。
二、為什么要使用FastCGI,而不是多線程CGI解釋器?
這可能出于多方面的考慮,例如:
1、你無論如何也不能在windows平臺上穩(wěn)定的使用多線程CGI解釋器,無論是IIS ISAPI方式還是APACHE Module方式,它們總是運(yùn)行一段時間就崩潰了。奇怪么?但是確實存在這樣的情況!
當(dāng)然,也有很多時候你能夠穩(wěn)定的使用多線程CGI解釋器,但是,你有可能發(fā)現(xiàn)網(wǎng)頁有時候會出現(xiàn)錯誤,無論如何也找不到原因,而換用FastCGI方式時 這種錯誤的概率會大大的降低。我也不清楚這是為什么,我想獨(dú)立地址空間的CGI解釋器可能終究比共享地址空間的形式來得穩(wěn)定一點(diǎn)點(diǎn)。
2、性 能!性能?可能么,難道FastCGI比多線程CGI解釋器更快?但有時候確實是這樣,只有測試一下你的網(wǎng)站,才能最后下結(jié)論。原因嘛,我覺得很難講,但 有資料說在Zend WinEnabler的時代,Zend原來也是建議在Windows平臺下使用FastCGI而不是IIS ISAPI或Apache Module,不過現(xiàn)在Zend已經(jīng)不做這個產(chǎn)品了。
三、不使用FastCGI的理由
1、多進(jìn)程比多線程消耗更多的服務(wù)器內(nèi)存,php-cgi.exe解釋器每進(jìn)程消耗7至25兆內(nèi)存,將這個數(shù)字乘以50或100試試。
2、性能。確實有時候多線程CGI解釋器更快,呵呵,而且有時候,它也很穩(wěn)定。
更多信息請查看IT技術(shù)專欄