在前面的幾個章節裡, 我們完成了CGI 程序的一般論述。 在此, 我給出一個簡單的示範程序作為對先前的內容的總結。
要使用這個程序, 您需要OmniHTTPD 的最新測試版: OmniHTTPD 2.0b1 (beta 1) for Windows 95/NT 。 如果您沒有, 可以在這裡下載( oh20b1.zip) 。
安裝OmniHTTPD 同第一講的方法一樣, 這裡就不再講了。 我在這裡只講一講這一版本中的一些設定問題:
開啟OmniHTTPD 的屬性設定對話框, 使用Web Server Global Setting 按鈕, 前往External 頁, 將.cgi 的設定刪除。 在未刪除時,用cgi 作擴展名的CGI 程式是作為Perl 程式處理的; 在我們的課程中, Perl 語言的CGI 程式的副檔名是.pl ,而編譯後的CGI 程式副檔名是.cgi ,所以, 要將設定作這樣的修改。
在這個版本的OmniHTTPD 中,對SSI(Server Side Include) 指令的支援比以前的版本大大加強了, 支援include 、 exec 等指令。 在示範程序中, 我用到了這些指令。
您將(ex8.zip) 下載後, 裡麵包含三個檔案: index.shtml 、 makelog.cpp 和makelog.exe 。 index.shtml 是一個包含SSI 指令的腳本, 請拷貝到c:httpdhtdocs 目錄下; makelog.exe 是CGI 程序, 請拷貝到c:httpdcgi-bin 目錄下; makelog.cpp 是makelog.exe 的來源文件, 如果您要修改編譯的話, 必須用32 位元的編譯器, 如VC 等, 否則無法使用。
除此之外, 您需要將OmniHTTPD 中的設定作一個修改: 選擇Default Virtual Setting , 在Server 頁上將Default Index 改為index.shtml 。 這樣, 當您在瀏覽器中敲入http://localhost 時, OmniHTTPD 會自動調入index.shtml 。
再做一個WEB 文檔, 以index.html 為文件名稱存在c:httpdhtdocs 目錄下。 您用瀏覽器存取localhost 時, index.shtml 先呼叫makelog.exe , 儲存使用者的存取信息, 再呼叫index.html , 將其顯示在瀏覽器中。 使用者的存取資訊儲存在c:httpdcgi-bin 目錄下的userlog 檔案中。
這個實例用到了CGI 規範中基本的環境變數和SSI 技術, 請您好好研究一下。
4 、 資料庫
在CGI 的應用中, 資料庫方面的應用是最體現CGI 程式強大功能的。 在互聯網上, 資料庫是非常多的, 而這些資料庫的WEB 應用的需求也是越來越多( 無論是來自公司的還是來自用戶的需求) 。 可以說, WEB 本身就是一個龐大的資料庫, 如何將這些龐大的資料集合有效的組織起來, 在WEB 上進行發布, 是CGI 和資料庫系統共同解決的課題。
如果要對CGI 和資料庫的應用進行分類的話, 從不同角度有不同的分類方法。 例如, 按資料庫的規模可以分成文字資料庫、 本地資料庫(Microsoft access 等) 和資料庫伺服器(MS SQL Server 、 Informix 等) ; 按CGI 的處理內容可以分為前端資料庫CGI 程式( 同使用WEB 瀏覽器的用戶互動的CGI 程式) 和後端資料庫CGI 程式( 同資料庫互動的CGI 程式) 等。 選擇資料庫的規模通常取決於您要完成的任務的資料量、 成本等; 在編制CGI 程式時採用前端和後端分開還是結合通常取決於您的資料處理的複雜程度等。
通常, 如果您的資料集合在幾兆位元組之內, 而且您的資料記錄之間沒有複雜的關係, 您可以選擇用文字檔案建立資料庫, 這樣可以使成本限制在最小, 而且文字檔案有一個資料庫管理系統(DBMS , 即DataBase Management System) 所沒有的優勢: 如果您的資料發生了錯誤, 您可以將您的文字檔案調入任何一個文字編輯器進行恢復, 而若是您的資料庫系統發生了錯誤,除非您是資料庫專家,否則很難修復。
如果您的資料集非常大, 或您的資料記錄之間存在著複雜的關係, 則最好選用資料庫系統。 用文字檔案實作一個幾十兆的資料庫會使任何一台高階的RISC 伺服器不堪重負。 如果您用CGI 程式處理資料間複雜的關係, 必然會使CGI 程式的複雜性加大, 佔用過多的伺服器資源; 另一方面, 利用資料庫系統的功能可以簡化CGI 程式設計的難度, 提高開發效率。
在選擇資料庫系統時, 您需要從以下幾個方面進行選擇: 一、 作業系統平台: 您應該選擇您最熟悉的資料庫系統, 也要選擇您最熟悉的作業系統平台, 只有這樣, 才可以少出錯誤。 二、 價格: 您應該在各種能完成您的工作的資料庫系統中選擇最便宜的, 在這裡, 我可以告訴大家一個免費的資料庫系統, 叫MiniSQL , 它必須在UNIX 或linux 平台上運行, 我還不知道哪裡有Windows 平台的免費資料庫系統, 如果誰知道, 請告訴我, 我會在未來的課程告訴大家的。
我們的課程是講述用Delphi 開發CGI 程式的, 而Delphi 中提供了Interbase Server 資料庫系統, 因此, 我在這裡將主要講述採用資料庫系統的CGI 程式開發。 同時, 由於資料庫系統減輕了大量的編碼工作, 我採用前端CGI 和後端CGI 合而為一的方式, 在一個CGI 程式中就完成使用者輸入處理和資料庫操作。 但在其他的系統平台上, 也許這種方式會不使用, 請各位讀者按前面的討論自己斟酌。
在這裡, 我要附帶說明一下幾種不同的CGI 及其在我們的OmniHTTPD 中的使用差異:
Standard CGI : 標準CGI , 必須放置在/cgi-bin/ 設定的目錄下, 可以在OmniHTTPD 運行時隨時修改。
Win CGI : 應用在Windows 系統中的CGI , 必須放置在/cgi-win/ 設定的目錄下。 此CGI 應用INI 檔案取得用戶端瀏覽器的請求, 而不是使用環境變數或標準輸入。 我們一般不使用這種CGI 。
ISAPI : Microsoft 公司提出的一種應用動態連結程式庫的CGI 規格。
NSAPI : Netscape 公司提出的一種應用動態連結程式庫的CGI 規範。
這幾種CGI 規格各有特色: 其中Standard CGI 可以使用可執行程式或Perl 等腳本語言編寫, 但效率低, 佔用資源多, 每一個CGI 請求就會有一個CGI 程式的實例在伺服器中執行。 Win CGI 的特性與Stardand CGI 相同。 ISAPI 和NSAPI 效率高, 常駐內存, 而且無論有多少CGI 請求, 在伺服器中只有一個實例在運行, 僅僅是這個實例對應的資料集合不同; 但這種CGI 不易調試, 因為它必須在WEB 伺服器軟體關閉時才可以進行更新。
在下一講中, 我將給予一個White Page 的示範程序。 White Page 是一個電子郵件地址的清單, 您可以讓使用者透過WEB 瀏覽器查詢此清單、 編輯、 新增和刪除等操作。 在這一講中, 我給出的示範程序只是查詢操作, 其他的操作將在以後的課程中講述。
這個示範程式建立在Borland Interbase Server 資料庫上, 用Delphi 開發。 在開發中, 我選擇的是Standard CGI , 因為這樣容易調試。
我們的程式使用Stardand CGI 進行編寫, 可以方便的調試。 等偵錯成功後, 在Delphi 中可以很方便的改成ISAPI/NSAPI , 僅僅是一個語句( 怎麼樣, Delphi 很不錯吧! ) 。