2008-04-11

CGI

iT邦幫忙─CGI效能不佳,有沒有簡單的解決方案?
文/李延華 (記者) 2008-04-10

改寫幅度最小的方案是採用FastCGI,而效能提升的原因在於FastCGI程式是常駐型的CGI程式,不會隨HTTP Request的結束而終止。


iT邦幫忙是 iThome Online專為 IT 人推出的新服務,在這個 IT 知識分享社群裡,有疑問的人可以找到答案,有知識的人可以幫助他人。快來這裡與 IT 人一起討論交流。

更多IT解答,請至iT邦幫忙



網站最初的風貌是一頁頁靜態的資訊,網際網路一開始是用以分享學術研究的資訊,雖然後續更加入圖形和聲音等元素,提供炫麗的聲光效果,但是很快地資訊的提供者與閱讀者都希望有更互動與即時的內容出現。

CGI(Common Gateway Interface,通用閘道介面)的出現,是一個改變的開始,當使用者透過提出要求(HTTP Request),Web伺服器讓網際網路從分享資訊的平臺,搖身一變,成為能夠與使用者互動,進而處理、回覆運算結果的應用程式。

雖然CGI開啟了網頁與使用者互動的可能性,但卻有效能上的瓶頸,隨著線上使用者的增加,對Web伺服器的影響很大。因此軟體廠商推出專屬的API,有效解決了效能問題,但不可避免帶來平臺綑綁的後果。而FastCGI則可避免有跨平臺的問題,也有效加速執行的效能。

CGI穩定性高,但效能上有瓶頸
CGI常應用於留言版、聊天室、人數統計、密碼確認等小功能,回頭檢視這項設計,它是標準的Web伺服器應用程式介面,而且是一個開放的標準,幾乎任何程式語言都可以開發CGI程式。

開發CGI程式並不困難,要應用CGI的運作模式,使用者瀏覽的網頁必定會含有:



以上的標記,將提供使用者輸入資料的表單。當使用者在表單中填妥資料,按下送出(Submit)鍵後,瀏覽器便以POST或GET的傳輸方式,將資料傳送至Web伺服器。

接著,Web伺服器會叫用網頁指定的CGI程式。然而,每當瀏覽器要求執行某個CGI程式時,Web伺服器會載入並執行CGI程式中的一個獨立實體,然後將使用者的要求資訊傳遞給該程式處理,接著再將執行結果傳回給使用者,然後結束CGI程式。

然而,此一模式的問題在於,CGI程式與桌上型應用程式一樣以EXE執行檔的方式執行,每個執行程式都會向作業系統要求產生一個行程(Process), 每個行程都會占用一些的系統資源,因此當同時上線的使用人數變得很多時,Web伺服器就會同時有很多的行程,對伺服器造成極大的負擔。這樣的架構使得 CGI的發展受限。

專屬API提升了效能,但與平臺綑綁
針對CGI影響效能的作法,軟體廠商發展了專屬的API稱為Server API,例如Netscape的NSAPI及微軟的ISAPI(Internet Server Application Programming Inter face)。

以ISAPI為例,每個ISAPI 程式都是以單支DLL形式存在,程式會在第一次被要求時,載入Web伺服器的記憶體空間中;DLL一旦載入,就會一直存在,回應使用者的要求,直到被刻意 自記憶體中釋放為止。這種方式不會同時產生多個DLL,也不需要重複啟動與初始化動作,因此採用Server API的效能比CGI佳。

不過,Server API不是沒有缺點,首先,ISAPI與NSAPI對平臺的相依性太高,不像CGI完全不受平臺的限制。其次有語言相依性,開發者只能選擇C語言。再者,多執行緒的情況下,撰寫ISAPI需要一點功力,以避免互相影響。

此外,NSAPI和ISAPI都與Web伺服器緊密綑綁,直接執行在Web伺服器的行程(Process)中,效能雖好但代價也很大──埋下隱定 性不佳的可能問題。如果程式撰寫得不好,資源無法釋放,造成記憶體漏洞(Memory leak),簡單地說,一支DLL有問題,可能導致整個Web伺服器停擺。

ASP、JSP易學易用,取而代之
著眼於CGI的效能瓶頸,及專屬API學習門檻高且與平臺綑綁造成的困境,微軟推出了易學易用的ASP,其他類似的技術包括PHP及JSP。我們可視ASP、JSP及PHP,皆為針對CGI技術的改良版,同樣為伺服器端網頁程式語言,程式都是建置在Web伺服器。

由於以CGI技術撰寫資料庫存取程式並不容易,所以需存取資料庫方面的網頁應用,ASP、JSP或PHP會是比較好的選擇。開發者可透過簡單的邏輯讀取資料,並加以處理,然後動態產生新的網頁,顯示運算的結果。

這類伺服器端網頁程式語言,比CGI程式簡潔,如果你想實作一個網頁計數器,PHP比CGI更好。因為相較之下,PHP需要寫的程式碼少了很多。

FastCGI是常駐型的CGI,從根本解決效能問題
除了將CGI改寫成ASP或PHP,FastCGI是比較無痛的解決之道。因為兩者的撰寫方式很相似,因此改寫的學習門檻不高。現行的CGI程式,可以很容易改寫成FastCGI,而且FastCGI也可以當作CGI執行。

FastCGI可以在Web伺服器啟動時就建立,也可以等到Web伺服器叫用它時才初始化。當瀏覽器發出HTTP Request,Web伺服器對FastCGI建立連線,並將使用者輸入的資訊與環境變數,傳送給FastCGI。FastCGI處理完後,將輸出結果透 過同一條連線送回伺服器,然後關閉連線。

但是與CGI最大的不同在於,FastCGI像是常駐型的CGI,它的壽命不會隨HTTP Request結束,而是繼續等待其他連線。

FastCGI與CGI十分類似,不受平臺、程式語言的限制,又大幅改良了效能不佳的問題。再加上它支援多執行緒,可以得到更好的效能。所以,為CGI的效能問題所困擾的企業,可以嘗試FastCGI作為改善效能的解決方案。文☉李延華

三種CGI應用程式執行方式的比較

資料來源:iThome整理,2008年3月

http://www.ithome.com.tw/itadm/article.php?c=48293

--
[垃圾桶] 裡沒有會話群組。 當您有超過 6423.752806 MB (還在增加中) 的免費儲存空間時,誰還需要刪除郵件?!

沒有留言: