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