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