通用閘道器介面

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

在電腦領域,通用閘道器介面 (英語:Common Gateway Interface,CGI) 是為提供網路服務而執行控制台應用 (或稱命令列介面)的程式,提供於伺服器上實現動態網頁的通用協定。通常情況下,一次請求對應一個CGI 指令碼的執行,生成一個 HTML。[1]

簡而言之,一個 HTTP POST 請求,從客戶端經由 標準輸入 傳送資料到一個CGI 程式。同時攜帶其他資料,例如 URL 路徑, HTTP頭欄位資料,被轉換為行程的環境變數。

歷史[編輯]

最初,CGI是在1993年由美國國家超級電腦應用中心NCSA)為NCSA HTTPd Web伺服器開發的。這個Web伺服器使用了UNIX shell 環境變數來儲存從Web伺服器傳遞出去的參數,然後生成一個執行CGI的獨立的行程

運作[編輯]

Perl是一個廣泛被用來編寫CGI程式的語言,但CGI是獨立於任何語言的。Web伺服器無須對語言有任何了解。事實上,CGI程式可以用任何手稿語言或者程式語言實現,只要該語言可以在系統上執行。除Perl外,像Unix shell 指令碼, Python, Ruby, PHP, Tcl, C/C++Visual Basic都可以用來編寫CGI程式。

實現維基百科編輯的CGI程式的一個例子:首先使用者代理程式向這個CGI程式請求某個名稱的條目,如果該條目頁面存在,CGI程式就會去取得那個條目頁面的原始資料,然後把它轉換成HTML並把結果輸出給瀏覽器;如果該條目頁面不存在,CGI程式則會提示使用者新建一個頁面。所有維基操作都是通過這個CGI程式來處理的。

CGI的工作方式,從Web伺服器的角度看,是在特定的位置(比如:http://www.example.com/wiki.cgi)定義了可以執行CGI程式。當收到一個匹配URL的請求,相應的程式就會被呼叫,並將客戶端傳送的資料作為輸入。程式的輸出會由Web伺服器收集,並加上合適的檔頭,再傳送回客戶端。

一般每次的CGI請求都需要新生成一個程式的副本來執行,這樣大的工作量會很快將伺服器壓垮,因此一些更有效的技術像mod_perl,可以讓指令碼直譯器直接作為模組整合在Web伺服器(例如:Apache)中,這樣就能避免重複載入和初始化直譯器。不過這只是就那些需要直譯器的高階語言(即解釋語言)而言的,使用諸如C一類的編譯語言則可以避免這種額外負荷。由於C及其他編譯語言的程式與解釋語言程式相比,前者的執行速度更快、對作業系統的負荷更小,使用編譯語言程式是可能達到更高執行效率的,然而因為開發效率等原因,在目前直譯語言還是最合適的。

變通方法[編輯]

如果代碼只是偶爾改變的話,我們可以在伺服器產生一個新的行程在編譯代碼之前進行處理。有一個例子是FastCGI,當然還包括其它編寫的加速器,它會在第一次呼叫指令碼時,在系統的某個地方儲存指令碼編譯過的版本。這樣對這個檔案以後的請求就會自動轉向這個編譯過的代碼,而不用每次呼叫指令碼直譯器來解釋指令碼。當更改了指令碼,加速器的臨時快取會被清空來保證呼叫的是新的版本的指令碼。

另一個方法是直接把直譯器放在Web伺服器中,這樣就無須新建一個行程來執行指令碼。Apache伺服器有很多這樣的模組,像mod_cplusplus頁面存檔備份,存於網際網路檔案館)、mod_perlmod_phpmod_pythonmod_ruby、和mod_mono

參見[編輯]

參考文獻[編輯]

  1. ^ RFC3875: The Common Gateway Interface (CGI) Version 1.1. [2019-08-19]. (原始內容存檔於2021-04-19). 

外部連結[編輯]