一 CGI原理及其性能
1) CGI概念
CGI即通用網(wǎng)關(guān)接口(Common Gateway Interface),它是一段程序,運行在服務(wù)器上,提供同客戶端HTML頁面的交互,通俗的講CGI就象是一座橋,把網(wǎng)頁和WEB服務(wù)器中的執(zhí)行程序連接起來,它把HTML接收的指令傳遞給服務(wù)器的執(zhí)行程序,再把服務(wù)器執(zhí)行程序的結(jié)果返還給HTML頁。
2)CGI程序語言
事實上,任何一種程序語言,只要能在服務(wù)器主機上利用CGI接口來編寫應(yīng)用程序,都可以叫作CGI程序語言。目前最為流行的CGI程序語言有四種:C,Shell,Perl和VisualBasic,其它一些語言也有許多人在用,如TCL,Fortran及AppleScript等。
3)CGI程序的執(zhí)行
CGI 程序一般是個可執(zhí)行程序。編譯好的CGI程序一般要集中放在一個目錄下。具體存放的位置隨操作系統(tǒng)的不同而不同。CGI程序的執(zhí)行一般有兩種調(diào)用方式:第一種是通過URL直接調(diào)用,如:“http://202.114.2.182/cgi-win /cgi.exe”,在瀏覽器的URL欄里直接寫入上述描述就可以調(diào)用該程序;另一種方式,也是主要的方式,是通過交互式主頁里的FORM欄調(diào)用,通常都是用戶在填完一張輸入信息Form后按確認按鈕啟動CGI程序。
4)CGI工作的主要流程
CGI工作的主要流程是:1.一個用戶請求激活一個CGI應(yīng)用程序;2.CGI應(yīng)用程序?qū)⒔换ブ黜摾镉脩糨斎胄畔⑻崛〕鰜恚?.將用戶輸入的信息傳給服務(wù)器主機應(yīng)用程序(如數(shù)據(jù)庫查詢〕;4.將服務(wù)器處理結(jié)果通過HTML文件返回給用戶;5.CGI進程結(jié)束。
5)CGI的性能評價
CGI 的跨平臺性能極佳,幾乎可以在任何操作系統(tǒng)上實現(xiàn),如DOS、WINDOWS、UNIX、OS/2、Macintosh等。實現(xiàn)CGI的編程語言也有很多選擇。CGI的應(yīng)用程序一般都是一個獨立的可執(zhí)行程序,和WWW服務(wù)器各自占據(jù)著不同的進程,而且一般一個CGI程序只能處理一個用戶請求。這樣,每有一個用戶請求,都會激活一個CGI進程,當用戶請求數(shù)量非常多時,會大量擠占系統(tǒng)的資源如內(nèi)存,CPU時間等,造成效能低下。
二 ISAPI原理及其性能
1)ISAPI概念
ISAPI即Internet Server Application Program Interface,是微軟提供的一套面向Internet服務(wù)的API接口,它能實現(xiàn)CGI能提供的全部功能,并在此基礎(chǔ)上進行了擴展,如提供了過濾器應(yīng)用程序接口。ISAPI 服務(wù)器擴展是可以被 HTTP 服務(wù)器加載和調(diào)用的 DLL。Internet 服務(wù)器擴展也稱為 Internet 服務(wù)器應(yīng)用程序 (ISA),用于增強符合 Internet 服務(wù)器 API (ISAPI) 的服務(wù)器的功能。ISA 通過瀏覽器應(yīng)用程序調(diào)用,并且將相似的功能提供給通用網(wǎng)關(guān)接口 (CGI) 應(yīng)用程序。
2)ISAPI程序語言
由于開發(fā)ISAPI應(yīng)用要用到微軟的一套API,所以能用來開發(fā)ISAPI應(yīng)用的語言不如CGI那么多。主要有VisualC++4.1以上版本,VisualBasic5.0、BorlandC++5.0也可以。
3)ISAPI原理
ISAPI 的工作原理和CGI大體上是相同的,都是通過交互式主頁取得用戶輸入信息,然后交服務(wù)器后臺處理。但是二者在實現(xiàn)機制上大相庭徑。ISAPI與CGI最大的區(qū)別在于:不同于CGI,在ISAPI下建立的應(yīng)用程序是以動態(tài)連接庫的形式存在;而CGI的應(yīng)用程序一般都是可執(zhí)行程序。
4)ISAPI程序的執(zhí)行
ISAPI 應(yīng)用的工作流程與CGI有一些不同。ISAPI應(yīng)用的DLL不僅可以象CGI程序一樣被用戶請求激活,還可以被系統(tǒng)預(yù)先激活來監(jiān)視用戶輸入;對于被用戶激活的DLL,在處理完一個用戶請求后不會馬上消失,而是繼續(xù)駐留在內(nèi)存中等待處理別的用戶輸入,直到過了一段時間后一直沒有用戶輸入。
5)5ISAPI性能評價
一個ISAPI的DLL,可以在被用戶請求激活后長駐內(nèi)存,等待用戶的另一個請求,還可以在一個DLL里設(shè)置多個用戶請求處理函數(shù),此外,ISAPI的DLL應(yīng)用程序和WWW服務(wù)器處于同一個進程中,效率要顯著高于CGI。不過ISAPI的平臺兼容性較差,目前只能用于微軟自己的Windows95和NT操作系統(tǒng)上,服務(wù)器平臺也僅限于 IIS(InternetInformationServer)和MSpersonalwebserver以及NTworkstation上的 peerwebserver。
6)ISAPI 篩選器是什么?
ISAPI 篩選器是在啟用 ISAPI 的 HTTP 服務(wù)器上運行的 DLL,用以篩選與服務(wù)器之間來回傳送的數(shù)據(jù)。該篩選器注冊事件的通知,例如登錄或 URL 映射。當發(fā)生選定事件時,篩選器被調(diào)用,并且您可以監(jiān)視及更改數(shù)據(jù)(在數(shù)據(jù)從服務(wù)器傳輸?shù)娇蛻舳嘶蛳喾吹倪^程中)?梢允褂 ISAPI 篩選器提供增強的 HTTP 請求記錄(例如,跟蹤登錄到服務(wù)器的用戶)、自定義加密、自定義壓縮或其他身份驗證方法。
7)ISAPI 服務(wù)器擴展和篩選器之間的區(qū)別是什么?
服務(wù)器擴展:在 URL 中引用時運行。被顯式調(diào)用,例如用 http://myserver/myprog.dll?。被用戶第一次調(diào)用時根據(jù)請求加載。
篩選器:為服務(wù)器處理的每個 URL 調(diào)用。如果發(fā)生已注冊事件,自動為任何發(fā)送到服務(wù)器的 URL 運行。服務(wù)因其注冊表項而啟動時加載。
服務(wù)器擴展和篩選器都:* 共享服務(wù)的處理空間。* 必須是線程安全的。* 一經(jīng)加載便保留在內(nèi)存中(直到服務(wù)停止或者內(nèi)存被其他進程所需要)。
三 ISAPI與CGI有哪些相同和不同之處?
ISAPI 服務(wù)器擴展為使用 Internet 服務(wù)器的通用網(wǎng)關(guān)接口 (CGI) 應(yīng)用程序提供了另一種選擇。與 CGI 應(yīng)用程序不同,ISAPI 在 HTTP 服務(wù)器所在的同一地址空間運行,并且可以訪問可由 HTTP 服務(wù)器使用的所有資源。ISA 的系統(tǒng)開銷比 CGI 應(yīng)用程序低,因為它們不要求創(chuàng)建其他進程,也不執(zhí)行需要越過進程邊界的通信,而這種通信非常耗時。如果內(nèi)存被其他進程所需要,擴展和篩選器 DLL 都可能被卸載。
Internet客戶端通過HTTP服務(wù)器調(diào)用ISAPI的方法與調(diào)用CGI應(yīng)用程序的方法一樣。例如,客戶端可以這樣調(diào)用一個 CGI 應(yīng)用程序:http://sample、example.exe?Param1&Param2,它可以這樣調(diào)用一個執(zhí)行相同功能的 ISAPI:http://sample/example.dll?Param1&Param2。ISAPI 允許在一個DLL中有多個命令,這些命令作為DLL中CHttpServer 對象的成員函數(shù)來實現(xiàn)。CGI要求每個任務(wù)有一個單獨的名稱和一個到單獨的可執(zhí)行文件的URL映射。每個新的CGI請求啟動一個新進程,而每個不同的請求包含在各自的可執(zhí)行文件中,這些文件根據(jù)每個請求加載和卸載,因此系統(tǒng)開銷高于ISA。
ISAPI 篩選器沒有等效的 CGI 篩選器。篩選器提供預(yù)處理和后處理在客戶端和服務(wù)器之間發(fā)送的所有數(shù)據(jù)的能力。
FastCGI
1. FastCGI 像是一個常駐 (long-live) 型的 CGI,它可以一直執(zhí)行著,只要激活后,不會每次都要花費時間去 fork 一次 (這是 CGI 最為人詬病的 fork-and-execute 模式)。
2. FastCGI 可在任何平臺上使用,Netscape Enterprise 及 IIS 都有 FastCGI 的模塊可供使用,阿帕契 (Apache,以及利用 Apache 衍生出做的服務(wù)器) 上也有 mod_fastcgi 可用。
3. FastCGI 支持 C/C++,Ruby, Perl,Tcl,Java,Python 等程序語言。
4. FastCGI 的應(yīng)用程序亦兼容于 CGI。即 FastCGI 的應(yīng)用程序也可以當成 CGI 來執(zhí)行。
5. 現(xiàn)有的 CGI 程序要改寫成 FastCGI 非常簡單,最少可能只需要多加入三行程序代碼。
6. FastCGI 的偵錯方式與 CGI 大同小異,只要帶入程序所需的環(huán)境變量及參數(shù),即可在命令列模式執(zhí)行或偵錯。
7. FastCGI 應(yīng)用程序的寫作方式與 CGI 類似,除了幾項原則要特別注意外,F(xiàn)astCGI 的寫作方式跟 CGI 幾乎一樣,與學(xué)習(xí) Web Server API 比較起來, FastCGI 簡單多了。
8. FastCGI 支授分布式運算 (distributed computing),即 FastCGI 程序可以在網(wǎng)站服務(wù)器以外的主機上執(zhí)行并且接受來自其它網(wǎng)站服務(wù)器來的請求。
PHP的FastCGI使你的所有php應(yīng)用軟件通過mod_fastci運行,而不是mod_phpsusexec。FastCGI應(yīng)用速度很快 是因為他們持久穩(wěn)定。不必對每一個請求都啟動和初始化。這使得應(yīng)用程序的開發(fā)成為可能,否則在CGI范例是不切實際的(例如一個大型的腳本,或者一個需要 連接單個或多個數(shù)據(jù)庫的應(yīng)用)。
好處
PHP腳本運行速度更快(3到30倍)。PHP解釋程序被載入內(nèi)存而不用每次需要時從存儲器讀取,極大的提升了依靠腳本運行的站點的性能。
需要使用更少的系統(tǒng)資源。由于服務(wù)器不用每次需要時都載入PHP解釋程序,你可以將站點的傳輸速度提升很高而不必增加cpu負擔(dān)。
不需要對現(xiàn)有的代碼作任何改變,F(xiàn)有的一切都適用于PHP的FastCGI
潛在問題
對所有的子目錄(/home/USERNAME/public_html/php.ini)你只有一個可用的php.ini文件。 這是優(yōu)化網(wǎng)站代碼所必需的。如果你需要多個php.ini文件以適應(yīng)不同的腳本需要,你可以在任何子目錄禁用PHP的快速CGI,而其余的地方則繼續(xù)有 效。如果你需要這樣做請聯(lián)系support。
你對PHP環(huán)境做的任何升級(如php.ini文件的改變)都有幾分鐘的延遲。這是因為為了更快的速度 你的php.ini文件已經(jīng)被載入內(nèi)存,而不是每次需要時再從存儲器重新讀取。