|
先了解一下普通cgi的工作流程:
web server收到用戶請求,并把請求提交給cgi程序,cgi程序根據(jù)請求提交的參數(shù)作相應(yīng)處理,然后輸出標準的html語句返回給web server,web server再返回給客戶端,這就是普通cgi的工作原理。 從上面看,cgi所要實現(xiàn)的不過是動態(tài)網(wǎng)頁而已,這種處理方式的特點就是每接到一個請求,web server都要fork出一個單獨的cgi程序的進程來處理,這種方式的好處是把web server和具體的程序處理獨立開來,結(jié)構(gòu)清晰,可控性強,同時缺點就是如果在高訪問需求的情況下,cgi的進程fork就會成為很大的服務(wù)器負擔,想象一下數(shù)百個并發(fā)請求導(dǎo)致服務(wù)器fork出數(shù)百個進程就明白了。這也是為什么cgi一直背負性能低下,高資源消耗的惡名的原因。 相應(yīng)的有問題就有解決方案,目前流行的方案就是使用模塊設(shè)計,基本上目前的web server都有相應(yīng)的模塊機制來擴充它的功能,只要按照其設(shè)計規(guī)范設(shè)計出來的模塊,就能插入到web server自身的進程處理,因此性能有很大改觀,例如IIS的isapi,apache的dso。但是,這種方法也不是沒有缺點的,例如對于不同的web server,要按照不同標準開發(fā),無法做到webserver無關(guān)性;例如這將輸入驗證的工作轉(zhuǎn)交給了web server,沒辦法自由處理;例如一旦出現(xiàn)問題將影響整個web server處理流程;例如插入web server進程導(dǎo)致的無法以多用戶標示運行,無法處理虛擬主機權(quán)限等。 所幸我們還有另外的選擇,這就是fastcgi。fastcgi是基于cgi架構(gòu)的擴展,他的核心思想就是在web server和具體cgi程序之間建立一個智能的可持續(xù)的中間層,統(tǒng)管cgi程序的運行,這樣web server只需要將請求提交給這個層,這個層再派生出幾個可復(fù)用的cgi程序?qū)嵗缓笤侔颜埱蠓职l(fā)給這些實例,這些實例是可控的,可持續(xù),可復(fù)用的,因此一方面避免了進程反復(fù)fork,另一方面又可以通過中間層的控制和探測機制來監(jiān)視這些實例的運行情況,根據(jù)不同的狀況fork或者回收實例,達到靈活性和穩(wěn)定性兼得的目的。 本人曾經(jīng)做過測試,使用cgi方式運行php效率最差,mod_php方式性能非常不錯,幾乎是cgi方式的50倍,但是無法保證虛擬主機站點的安全性隔離,而fastcgi性能則基本和mod_php相當,這還是在使用了suexec切換虛擬主機站點運行用戶的情況下的結(jié)果。 參考:mod_fcgid
|
|
|
來自: Ralf_Jones > 《PHP》