線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1985
推到 Plurk!
推到 Facebook!

CGI技術及其開發

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-29 01:46:06 IP:61.64.xxx.xxx 未訂閱
主題:CGI技術及其開發(一)返回 日期: 1991/3/30 作者:戚文敏 作為Internet上最主要的資訊管理和組織手段,WWW由一系列相應的技術及應用構 成,其組成技術包括HTTP、HTML、URL以及CGI等。WWW伺服器本身提供一些基本功 能,以完成用戶端的請求和自身的管理。但不同的用戶有不同的功能要求,其中許 多功能是WWW伺服器本身 不能提供的(比如線上查詢等),它必須提供一種擴展手 段,以允許用戶編寫擴展應用程式來擴展伺服器的功能。CGI(CommonGatewayInterface, 即通用閘道介面)就是這樣的一種標準擴展技術。下面就CGI的基本技術及其開發 進行討論。 一、CGI技術 1.1CGI的提出 CGI是外部擴展應用程式與WWW伺服器交互的一個標準介面。按照CGI標準編寫的外 部擴展應用程式可以處理用戶端(一般是WWW流覽器)輸入的協同工作資料,完成 用戶端與伺服器的交互操作。這在實際應用中非常有用,如可以編寫CGI外部擴展 程式來訪問外部資料庫,用戶端用戶可以通過它和WWW伺服器來進行資料查詢。CGI 一般分兩種:標準CGI和緩衝CGI。所有的WWW伺服器均應支援標準CGI,按標準CGI 編寫的程式與具體的WWW伺服器無關。而按緩衝CGI編寫的程式與WWW伺服器有關。 1.2CGI的工作原理 1.標準CGI 用戶端、伺服器、CGI介面與外部程式間的關係可用圖1-1表示:如上圖所示,服 務器是用戶端(如流覽器)與擴展程式之間的通道。當用戶端的用戶完成了一定 輸入工作(比如填充完HTML文檔中的FORM表)之後向伺服器發出HTTP請求(稱為CGI 請求),伺服器守護進程接收到該請求後,就創建一個子進程(稱為CGI進程)。 該CGI子進程將CGI請求的有關資料設置成環境變數,在外部CGI程式與伺服器間建 立兩條資料通道(標準I/O),然後啟動URL指定的CGI程式,並與該子進程保持同 步,以監測CGI程式的執行狀態。子進程通過標準輸出流將處理結果傳遞給伺服器 守護進程,守護進程再將處理結果作為應答消息回送到用戶端。外部CGI程式通過 環境變數、命令行參數、標準輸入輸出與WWW伺服器進行通訊,傳遞有關參數和處 理結果。*環境變數:當伺服器守護進程創建子進程運行CGI程式時,設置相應的 環境變數和命令行參數,以傳遞用戶端和伺服器的有關資訊給該子進程。*命令行 參數:命令行參數僅在有HTML文檔中有ISINDEX查詢的情況下使用。*標準輸入輸 出:當HTTP請求模式採用POST方式時,CGI程式通過標準輸入流和有關環境變數來 獲取用戶端傳輸資料;如採用GET方式時,CGI程式直接通過環境變數獲取用戶端傳 輸數據。當CGI程式要返回處理結果(一般為HTML文檔)給用戶端時,它通過標準 輸出流將該結果資料傳遞給伺服器守護進程。 2.緩衝CGI 標準CGI使用Stdin/Stdout來進行資料通訊,這是由其最初開發環境(Unix操作 系統)所決定的。但是許多Windows環境下的編程工具(如VB和Delphi等)是不支 持這種I/O方式的,這時就不能用它們來開發基於標準CGI的應用程式。於是有些 伺服器提出了緩衝CGI的概念。緩衝CGI亦稱為WinCGI。此時CGI擴展程式與伺服器 間通過緩衝CGI而不是標準CGI進行通訊,而緩衝CGI與伺服器間的通訊還是通過標 准CGI介面。後者由WWW伺服器的內置緩衝處理程式實現。這幾部分的關係可用圖 1-2表示:緩衝CGI的工作原理與標準CGI相似,不同的是當伺服器守護進程接收 到用戶端的CGI請求時,所建立的CGI子進程將CGI請求的有關資料設置成環境變數 外,還將它們保存在輸入緩衝區中;通過緩衝處理程式在外部CGI程式與伺服器間 建立兩條資料通道(輸入/輸出緩衝區)。CGI子進程通過輸出緩衝區將處理結果 傳遞給伺服器守護進程。此處外部CGI程式通過環境變數和輸入/輸出緩衝區與WWW 伺服器進行通訊,傳遞有關參數和處理結果。此處環境變數的意義同上,不過這 些環境變數及其相應值保存在輸入緩衝區中。此外,輸入緩衝區中還存放用戶端 的傳輸資料(如採用POST模式的話)。輸出緩衝區用來存放擴展程式的處理結果。 3.標準CGI與緩衝CGI的區別 對CGI擴展程式而言,最主要差別在於資料的I/O不同:對緩衝CGI,伺服器與CGI 擴展程式間的資料交換是通過緩衝區;而標準CGI是通過標準I/O。使用緩衝CGI可 選擇更多的開發工具,可以開發Windows95和WindowsNT下的GUI擴展程式;而使用 標準CGI所選用的開發工具必須支援標準I/O。只有少數幾種WWW伺服器支援緩衝CGI, 因此基於它的擴展程式相容性不如標準CGI好。 1.3CGI與其他WWW技術的關係 CGI作為WWW伺服器的標準擴展技術,由上面CGI的基本原理可知,它和許多其他的 WWW技術密切相關,如HTTP、HTML、MIME和URL等,下面主要就它與前兩種技術的關 系進行研究。 1.CGI與HTTP協議 CGI通過HTTP協定在用戶端和服務端進行通訊:*用戶端用戶代理向伺服器發送的 請求是HTTP請求消息。該消息中含有處理用戶輸入的CGI擴展程式的URL值。*CGI 擴展程式在處理結束後,返回給用戶端的應答是HTTP應答消息。因此CGI程式的輸 出資料必須符合HTTP應答消息的語法格式,這在基於CGI標準的開發中非常重要。 2.CGI與HTML語言 CGI擴展程式的輸出資料(HTTP應答消息)一般有兩種:符合MIME類型的文檔(最 普遍的是HTML文檔,表示為text/html);指向其他文檔的URL鏈結。這兩種方式 都與HTML語言有關,資料的組織須符合HTML語法格式。 1.4CGI開發的幾個問題 基於WWW的人機交互一般有兩種情況:本地交互和通過網路傳輸的交互。前者是指 用戶端用戶的輸入資料在用戶端本地進行處理,然後將處理結果返回給用戶,常 見的開發工具有JavaScript(Netscape開發)和VBScript(Microsoft開發);後 者是指用戶端用戶輸入的資料通過網路傳輸到WWW伺服器,伺服器處理結束後將處 理結果返回給用戶端用戶,常見的開發技術是WWW伺服器擴展技術(如CGI,API等)。 此處主要討論基於標準CGI技術的通過網路進行資料傳輸的交互實現。對這種人機 交互的實現,主要有三個環節需要解決:如何獲取用戶端傳輸的資料,如何提取有 效資料並處理這些資料,如何向用戶端返回應答。下面分別結合有關技術,談談這 三方面問題的解決。 1.用戶端傳輸資料的獲取 由第三章CGI的原理可知,當服務端守護進程接收到用戶端用戶代理(如流覽器) 提交的CGI請求時,所創建的CGI子進程會設置與CGI請求內容有關的環境變數,並 建立伺服器與外部CGI程式之間通訊的通道(即標準I/O)。CGI程式可以通過環境 變數,標準I/O或命令行參數獲取用戶端用戶輸入的資料。資料的獲取與請求所采 用的HTTP方法(Method)和用戶所使用的請求方式有關。用戶通過CGI請求資料一 般有三種方式:HTMLFORM表,ISINDEX,可點擊圖片(ISMAP或Imagemaps)。後兩 種方式是通過命令行參數傳遞用戶的輸入資料;在C語言中(下面的舉例亦然), CGI程式可以用argc和argv〔int〕獲得這些參數值。而前一種方式則取決於HTTP請 求方法;但不管採用何種方法,都將用到環境變數來傳遞有關請求內容。 ●獲取環境變數 環境變數的類別很多,包含用戶端和服務端的詳細資訊。在一般CGI程式開發中, 下述幾個環境變數在資料傳遞中起著重要作用。 *GATEWAY-INTERFACE CGI程式所使用的CGI標準介面的版本號。如使用的CGI1.1版,該變數表示為 "CGI/1.1" *REQUEST-METHOD HTTP請求方法。根據該變數值可判斷CGI請求所採用的請求方法,以決定是通過Stdin 還是通過環境變數QUERY-STRING獲取用戶端傳輸資料。 *QUERY-STRING QUERY-STRING是CGI程式URL中〃?〃之後的資料。當使用ISINDEX查詢或FORM表使 用GET方法時,用戶端傳輸資料可以通過讀取該變數而獲得。 *CONTENT-LENGTH CONTENT-LENGTH表示用戶端傳輸資料的位元組數。 *CONTENT-TYPE CONTENT-TYPE表示用戶端傳輸資料的資料編碼類型。 利用-environ(int)函數可以獲得所有的環境變數及其值; 利用getenv(constchar*)函數可以獲得指定環境變數的相應值。 ●HTTP請求方法 用戶端用戶代理提交的CGI請求是HTTP請求,其中包括HTTP請求方法。HTTP協議定義 的請求方法中常用的主要有GET和POST。 用戶端FORM表的METHOD屬性用來設置請求方法,其缺省值為GET。如果在FORM中使用 GET方法,CGI程式通過環境變數QUERY-STRING獲取用戶端傳輸資料。如果在FORM中 使用POST方法,CGI程式通過通過CONTENT-LENGTH獲取用戶端傳輸資料的位元組數, 通過Stdin讀取用戶端傳輸資料。 2.有效資料的提取和處理 通過上述方式獲取的用戶端傳輸資料的一般格式為: name〔1〕=value〔1〕&name〔2〕=value〔2〕&...name〔i〕 =value〔i〕...name〔n〕=value〔n〕 (1Ι=iΙ=n) 其中name〔i〕表示變數名,它是在FORM表中某輸入域的名字;value〔i〕表示變數 值,它是用戶在FORM表中某輸入域中輸入的值。用戶端傳輸資料的每對〃Name=Value〃 串由′&′字元分隔,其資料編碼類型可以從環境變數CONTENT-TYPE獲取。CGI/1.1 版僅支援"application/x-www-form-urlenQcoded"編碼方式。這種編碼方式和 URL的編碼方式一樣,遵循兩個規則:資料中的空格(ASCII碼值32)編碼成′+′號; 保留字元編碼成〃%XX〃形式,〃XX〃是該字元ASCII值的十六進位表示,比如〃$〃 的編碼為〃%24〃,〃?〃的編碼為〃%3F〃。因此,要獲取用戶端用戶的輸入資料, 必須對上述獲取的資料進行分離和解碼等處理。利用函數strtok()、strchr()等 可以實現資料分離處理,而資料的解碼則需要對整個資料串進行掃描,將資料串中的 〃%XX〃復原為對應的ASCII碼。在提取到有效資料後,還可能進行許多其他的處理, 如資料庫查詢等。這種處理與普通編程相同。 3.向用戶端返回應答 CGI程式處理結束後,通過標準輸出流將應答資訊傳遞給伺服器,再由伺服器返回給發 出請求的用戶端。其輸出的應答資訊是HTTP應答消息,它一般由兩部分組成:應答頭 和應答數據。常見的應答頭包括三種頭域:Content-Type(資料編碼類型,用MIME類 型表示),Location(特定文檔的URL,這種情況不直接向用戶端輸出內容而輸出該URL) 和Status(處理結果的狀態碼和狀態描述)。HTTP應答頭由幾行格式相同的文本構成, 每行的基本格式為:〃頭功能變數名稱:該域內容〃。應答頭和應答體之間用一空行加LF(或 CR/LF)分隔。應答體為CGI擴展程式的輸出資料,其資料類型應該與Content-Type 值相一致。CGI程式的輸出可以用printf()、puts()等標準I/O函數來實現。 4.CGI程式的開發及其一般流程 在開發CGI程式過程中,可根據實際情況(伺服器提供的介面、實際需求和程式師經驗 等)選擇編程語言,如C/C++,Perl,TCL,AnyUnixshell,VB,AppleScript。如 果選用C/C++等語言,必須編譯成可執行檔;如果選用Perl等解釋語言,伺服器 必須安裝相應的解釋器。 二、CGI與其他擴展技術的比較 除CGI標準擴展技術外,常見的擴展技術還有API(ApplicationProgrammingInterface) 和SSI(ServerSideIncludes),這兩種技術都與具體的WWW伺服器有關。下麵先對這兩 種技術簡要說明,然後再對這三種技術作比較。SSI技術:當伺服器守護進程接收到客 戶端請求時,其子進程掃描用戶端所請求的文檔,以獲取資料插入標誌,再插入相關動 態資料,然後返回給用戶端。這種技術簡單,但效率不高。API技術:不同的WWW伺服器 提供的API可能不同,比如O′ReillyWebsite提供的是WSAPI;PurveyorWebserver和Microsoft IIS提供的是ISAPI。利用這些API編寫程式的流程和最後生成的檔類型也不一樣;比 如用ISAPI,編寫程式時必須依照它的特定框架,最後建立的檔可以是EXE檔和DLL 文件。下表(圖3-3)列出了CGI、SSI和API三種技術在主要性能方面的比較:SSI CGI API 實現的靈活性 差 好 好 可實現的功能 差 強大 強大對程式師的要求 低 一般 較高 開發與測試時間 短 一般 較長 花費 低 一般 較高操作的風險性 低 低 較大移植性 較好 較好 差 CPU的負載 高 高 較低CGI和API都需要編程實現,利用它們可訪問更 多的數據源;而SSI不需編程。利用API開發的擴展軟體,其運行速度比CGI快,功能也 較CGI強;但其操作有一定的風險,出現錯誤時可能使系統崩潰(CGI程式不會),並 且它非常依賴於具體的伺服器而移植性太差,開發週期較長。CGI在操作的風險性、軟 件移植性、軟體發展難度等方面較API有優勢;其缺點在於CPU負載較高,特別是同時 發生的CGI請求很多時,將影響伺服器的綜合性能。綜合比較而言,CGI比其他兩種技 術更優秀,在實際應用中也最為普遍。 ********************************************************************** 主題:CGI技術及其開發(二)返回 日期: 1991/3/30 作者:戚文敏 在 上 一 講 中, 我 們 設 置 了 用 於 開 發 CGI 程 序 的 系 統。 今 天, 我 們 進 入: 第 二 部 分、 CGI 程 序 設 計 的 概 念 …… 第 二 部 分、 CGI 程 序 設 計 的 概 念 1.0 、 CGI 程 序 的 功 能: 首 先, 什 麼 是 公 共 網 關 接 口( CGI ) 呢? CGI 是 一 個 用 於 定 義 WEB 服 務 器 與 外 部 程 序 之 間 通 信 方 式 的 標 准, 使 得 外 部 程 序 能 生 成 HTML 、 圖 象 或 者 其 他 內 容, 而 服 務 器 處 理 的 方 式 與 那 些 非 外 部 程 序 生 成 的 HTML 、 圖 象 或 者 其 他 內 容 的 處 理 方 式 是 相 同 的。 因 此, CGI 程 序 不 僅 使 你 能 生 成 靜 態 內 容, 而 且 能 生 成 動 態 內 容。 使 用 CGI 的 原 因 在 於 它 是 一 個 定 義 良 好 並 被 廣 泛 支 持 的 標 准。 雖 然, Java 、 ActiveX 等 可 以 完 成 CGI 程 序 的 功 能, 但 並 不 是 所 有 瀏 覽 器 都 支 持 它 們。 相 反, 所 有 瀏 覽 器 都 支 持 CGI , 如: Lynx 、 IE 、 Netscape 等。 然 而, 和 其 他 技 術 一 樣, CGI 也 有 它 的 局 限 性。 本 節 我 就 講 述 CGI 程 序 的 功 能、 優 點 與 不 足。 1.1 、 CGI 功 能 有 許 多 任 務, CGI 是 最 佳 的 是 唯 一 的 選 擇, 這 些 任 務 可 分 為 三 類: 初 級 任 務、 中 級 任 務 和 高 級 任 務。 初 級 任 務 是 一 些 不 用 怎 麼 編 程 的 任 務, 如: 文 本 型 計 數 器 生 成 簡 單 的 HTML 的 程 序 少 於 50 行 用 Perl 語 言、 Shell 腳 本、 C 語 言 或 C 語 言 編 寫 的 程 序 這 樣 的 任 務 用 CGI 來 寫 至 少 有 三 點 好 處: 第 一、 CGI 運 行 最 快, 而 Java 等 開 銷 太 大; 第 二、 CGI 標 准 於 當 前 瀏 覽 器 最 兼 容, 這 一 點 在 前 面 已 經 提 到; 第 三、 CGI 資 源 豐 富, 您 在 Internet 上 可 以 找 到 成 千 上 萬 的 CGI 代 碼。 中 級 任 務 是 包 括 圖 象 映 象 和 其 他 一 些 稍 複 雜 的 程 序 設 計 任 務。 在 中 級 任 務 中, 用 CGI 和 Java 來 編 寫 程 序 的 難 易 程 度 差 別 不 大。 此 類 任 務 包 括: 圖 象 映 象 生 成 整 頁 的 HTML 的 CGI 腳 本 動 畫 很 有 特 點 的 是, 對 于 高 級 任 務, 用 CGI 比 用 Java 編 程 要 簡 單 得 多。 此 類 任 務 有: 後 端 數 據 庫 操 作 搜 索 引 擎 多 重 動 態 頁 面 其 中, 後 端 數 據 庫 操 作( 存 取 數 據 庫 的 應 用 程 序) 體 現 了 CGI 的 優 越 性。 CGI 有 一 定 的 曆 史, 其 中 很 多 有 用 的 功 能 都 在 CGI 的 庫 中 由 別 人 做 好 了; 同 時, 許 多 大 公 司 提 供 了 用 CGI 承 蠆 僮 髕 涫 菘 獾 姆 椒?6 遙? ava 是 一 種 程 序 設 計 語 言, 而 CGI 是 網 關 程 序 的 功 能 規 範。 如 果 Java 有 較 大 改 變, 您 得 重 寫 整 個 程 序; 而 CGI 有 較 大 變 化 的, 您 只 要 升 級 CGI 庫 程 序 即 可。 然 而, CGI 在 有 些 方 面 還 是 有 局 限 性 的。 1.2 、 CGI 的 局 限 性 在 圖 象 映 象 和 動 畫 方 面, CGI 程 序 不 如 Java 程 序 開 發 方 便。 現 在 Java 越 來 越 流 行, CGI 程 序 則 越 來 越 適 合 編 寫 簡 短 雜 亂 的 程 序 和 數 據 庫 應 用 程 序。 1.3 、 CGI 程 序 功 能 CGI 程 序 的 最 大 特 點 是 可 以 用 任 何 一 種 語 言 編 制, 可 運 行 在 任 何 一 種 平 台 上, 只 要 它 符 合 CGI 的 規 範 即 可。 下 表 是 一 個 比 較: 任 務 CGI HTML HTML 處 理 表 單 Yes No 創 建 WEB 頁 面 上 非 靜 態 內 容 Yes No 處 理 圖 象 映 象 文 件 Yes Yes 在 WEB 頁 面 和 文 檔 中 搜 索 Yes No 創 建 表 單 Yes Yes 創 建 平 台 無 關 的 文 檔 Yes Yes 創 建 聊 天 室 等 交 互 應 用 程 序 Yes No 頁 面 動 態 生 成 Yes No 按 用 戶 需 要 進 行 頁 面 文 檔 裁 剪 Yes No 下 面, 我 們 用 一 系 列" Hello World " 程 序 結 束 本 講: Perl : Require "cgi-lib.pl"; print &PrintHeader; print "\n"; print "Hello World\n"; print &PrintEnv; exit; 此 文 件 存 儲 在 C:\HTTPD\CGI-BIN 目 錄 下, 文 件 名 為 2_1.pl 。 在 瀏 覽 器 中 用 地 址 http://localhost/cgi-bin/2_1.pl 調 用。 注 意, 此 時 OmniHTTPD 應 在 運 行。 如 果 一 切 正 常, 您 可 以 在 瀏 覽 器 中 看 見" Hello World " 和 環 境 變 量。 C : #include #include "html-lib.h" #include "cgi-lib.h" int main() { html_header(); html_begin("Test CGI"); h1("CGI Program"); printf(" ------------------------------------------------------------------------------ -- \n"); h2("CGI Environment Variables"); print_cgi_env(); html_end(); return 0; } 編 譯 後 將 可 執 行 文 件 複 制 到 C:\HTTPD\CGI-BIN 下, 改 名 為 2_1.cgi , 用 地 址 http://localhost/cgi-bin/2_1.cgi 調 用。 *************************************************************************** 哈哈&兵燹
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-06-18 14:15:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!