通用網關接口
此條目翻譯品質不佳。 |
在計算機領域,通用網關接口 (英語: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_perl、mod_php、mod_python、mod_ruby、和mod_mono。
參見
參考文獻
- ^ RFC3875: The Common Gateway Interface (CGI) Version 1.1. [2019-08-19]. (原始內容存檔於2021-04-19).
外部連結
- The CGI/1.1 specification.
- The complete list of CGI variables is at https://web.archive.org/web/20060424143818/http://hoohoo.ncsa.uiuc.edu/cgi/env.html.
- The SCGI (頁面存檔備份,存於網際網路檔案館) protocol is a replacement for the Common Gateway Interface (CGI) protocol.
- mod_cplusplus for Apache (頁面存檔備份,存於網際網路檔案館)