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