CGI

通用網關介面

CGI意思為CommonGatewayInterface,一種基於瀏覽器的輸入、在Web伺服器上運行的程序方法。CGI腳本使瀏覽器與用戶能交互,為了在資料庫中尋找一個名詞,提供你寫入的評論,或者從一個表單中選擇幾個條目並且能得到一個明確的回答。如果曾經遇到過在web上填表或進行搜索,就是用的CGI腳本。那時也許沒有意識到,因為大部分工作是在伺服器上運行的,看到的只是結果。

運行環境


CGI程序最初在UNIX操作系統上CERN或NCSA格式的伺服器上運行。

操作系統


(WindowsNT及Windows95的伺服器上也廣泛地使用CGI程序,同時它也適用於各種類型機器。

處理步驟


(1)通過Internet把用戶請求送到web伺服器
(2)web伺服器接收用戶請求並交給CGI程序處理。
(3)CGI程序把處理結果傳送給web伺服器。
(4)web伺服器把結果送回到用戶。

編寫語言


CGI可以用任何一種語言編寫,只要這種語言具有標準輸入、輸出和環境變數。對初學者來說,最好選用易於歸檔和能有效表示大量數據結構的語言,例如UNIX環境中:
·Perl(PracticalExtractionandReportLanguage)
·BourneShell或者Tcl(ToolCommandLanguage)
·PHP(HypertextPreprocessor))
由於C語言有較強的平台無關性,所以也是編寫CGI程序的首選。
Windows環境中:
·C和C++
由於Internet上大部分伺服器使用的是UNIX操作系統,且幾乎任一UNIX操作系統中都有BourneShell,因而後面講述的例子中大部分是用BourneShell編寫的。
最終Perl由於其跨操作系統、易於修改的特性成為了CGI的主流編寫語言,以至於一般的“cgi程序”就是Perl程序。

伺服器配置


CGI程序不是放在伺服器上就能順利運行,如果要想使其在伺服器上順利的運行並準確的處理用戶的請求,則須對所使用的伺服器進行必要的設置。
配置:根據所使用的伺服器類型以及它的設置把CGI程序放在某一特定的目錄中或使其帶有特定的擴展名。
⑴CREN格式伺服器的配置:
編輯CREN格式伺服器的配置文件(通常為/etc/httpd.conf)在文件中加入:Execcgi-bincgi-bin/。命令中的第二個參數表示CGI程序目錄放在系統中的真實路徑。
CGI目錄除了可以跟網路文件放在同一目錄中,也可以放在系統的其它目錄中,但必須保證在你的系統中也具有同樣的目錄。在對伺服器完成設置后,須重新啟動伺服器(除非HTTP伺服器是用inetd啟動的)。
⑵NCSA格式伺服器的配置
在NCSA格式伺服器上有兩種方法進行設置:
①在srm.conf文件(通常在conf目錄下)中加入:ScriptAlias/cgi-bin/cgi-bin/。ScriptAlias命令指出某一目錄下的文件是可執行程序,且這個命令是用來執行這些程序的;此命令的兩個參數與CERN格式伺服器中的Exec命令的參數的含意一樣。
②在srm.conf文件加入:Addtypeapplication/x-httpd-cgi.cgi。此命令表示在伺服器上增加了一種新的文件類型,其後第一個參數為CGI程序的MIME類型,第二個參數是文件的擴展名,表示以這一擴展名為擴展名的文件是CGI程序。
在用上述方法之一設置伺服器后,都得重新啟動伺服器(除非HTTP伺服器是用inetd啟動的)。

環境變數列表


SERVER_NAME:運行CGI序為機器名或IP地址。
SERVER_INTERFACE:WWW伺服器的類型,如:CERN型或NCSA型。
SERVER_PROTOCOL:通信協議,應當是HTTP/1.0。
SERVER_PORT:TCP埠,一般說來web埠是80。
HTTP_ACCEPT:HTTP定義的瀏覽器能夠接受的數據類型。
HTTP_REFERER:發送表單的文件URL。(並非所有的瀏覽器都傳送這一變數)
HTTP_USER-AGENT:發送表單的瀏覽的有關信息。
GETWAY_INTERFACE:CGI程序的版本,在UNIX下為CGI/1.1。
PATH_TRANSLATED:PATH_INFO中包含的實際路徑名。
PATH_INFO:瀏覽器用GET方式發送數據時的附加路徑。
SCRIPT_NAME:CGI程序的路徑名。
QUERY_STRING:表單輸入的數據,URL中問號后的內容。
REMOTE_HOST:發送程序的主機名,不能確定該值。
REMOTE_ADDR:發送程序的機器的IP地址。
REMOTE_USER:發送程序的人名。
CONTENT_TYPE:POST發送,一般為application/xwww-form-urlencoded。
CONTENT_LENGTH:POST方法輸入的數據的位元組數。

優點


CGI可以為我們提供許多HTML無法做到的功能。比如a.一個記數器b.顧客信息表格的提交以及統計c.搜索程序d.WEB資料庫,用Html是沒有辦法記住客戶的任何信息的,就算用戶願意讓你知道。用Html也是無法把信息記錄到某一個特定文件里的。要把客戶端的信息記錄在伺服器的硬碟上,就要用到CGI。這是CGI最重要的作用,它補充了Html的不足。是的,僅僅是補充,不是替代。
使在網路伺服器下運行外部分應用程序(或網關)成為可能。CGI-BIN目錄是存放CGI腳本的地方。這些腳本使Web伺服器和瀏覽器能運行外部程序,而無需啟動另一個程序。
它是運行在Web伺服器上的一個程序,並由來自於瀏覽者的輸入觸發。CGI是在HTTP伺服器下運行外部程序(或網關)的一個介面,它能讓網路用戶訪問遠程系統上的使用類型程序,就好像他們在實際使用那些遠程計算機一樣。
CGI能夠讓瀏覽者與伺服器進行交互,如果你曾經遇到過在網路上填表或者進行搜索,就很有可能就是用的CGI。
儘管CGI易於使用,但是當大批人同時使用一個CGI應用程序是會反應較慢,網路伺服器速度也會受到很大影響。CGI應用程序的優點是可以獨立運行。
CGI應用程序可以由大多數的編程語言編寫,如Perl(PracticalExtractionandReportLanguage)、C\C++、Java和VisualBasic等。不過對於那些沒有太多編程經驗的網頁製作人來說,實在是一個不小的難題。

ASP


ASP(ActiveServerPages):活動伺服器頁面,就是一個編程環境,在其中,可以混合使用HTML、腳本語言以及組件來創建伺服器端功能強大的Internet應用程序。如果你以前創建過一個站點,其中混合了HTML、腳本語言以及組件,你就可以在其中加入ASP程序代碼。通過在HTML頁面中加入腳本命令,你可以創建一個HTML用戶界面,並且,還可以通過使用組件包含一些商業邏輯規則。組件可以被腳本程序調用,也可以由其他的組件調用。
ASP的工作原理:
當在Web站點中融入ASP功能后,將發生以下事情:
1、用戶調出站點內容,默認頁面的擴展名是.asp。
2、瀏覽器從伺服器上請求ASP文件。
3、伺服器端腳本開始運行ASP。
4、ASP文件按照從上到下的順序開始處理,執行腳本命令,執行HTML頁面內容。
5、頁面信息發送到瀏覽器。
因為腳本是在伺服器端運行的,所以Web伺服器完成所有處理后,將標準的HTML頁面送往瀏覽器。這意味著,ASP只能在可以支持的伺服器上運行。讓腳本駐留在伺服器端的另外一個益處是:用戶不可能看到原始腳本程序的代碼,用戶看到的,僅僅是最終產生的HTML內容。
PHP:HypertextPreprocessor
PHP是一種伺服器端的,嵌入HTML的腳本語言。PHP區別其他像客戶端Javascript的地方是它的代碼在伺服器端執行.PHP能做什麼?
最低水平,PHP可以做任何其他CGI程序所能做的事,例如收集表格數據,生成動態頁面內容,或者收發cookies.可能最強大,最有意義的特性是PHP支持大範圍的資料庫。書寫一個支持資料庫的Web頁面是難以置信的簡單。
下面是當前支持的資料庫:
AdabasDInterBaseSolid
dBasemSQLSybase
EmpressMySQLVelocis
FileProOracleUnixdbm
InformixPostgreSQL
PHP通過協議也支持與其他服務的"交談",像IMAP,SNMP,NNTP,POP3,甚至是HTTP.你也可以打開晦澀的網路介面和其他協議交互。
PHP的簡要歷史
1994年秋季,RasmusLerdorf開始構思PHP.早期的非發行版本被用在他的主頁上,以追蹤誰在看他的在線簡歷.1995年年初第一版本出台,當時PHP只被認為是個人主頁開發工具。它由一個非常單純的只能理解很少數特殊宏的分析引擎和一些用在主頁後端通用的工具組成。如留言簿,計數器和其他一些東西。這個分析器在1995年年中被重寫並被命名為PHP/FI第二版.FI來自Rasmus寫的另外一個包,用於解釋html形式的數據。他結合了個人主頁工具腳本和形式解析器,並加上mSQL支持。這樣就產生PHP/FI了.PHP/FI以令人驚奇的步調成長,人們開始把自己的代碼貢獻給它。
很難給出它的硬統計表,但可以估計在1996年末,整個世界至少有15,000個網站在用PHP/FI.到1997年年中,這個數字已經超過50,000了.而在此時PHP的發展也發生了變化。由Rasmus自己偏愛的和幾個人開發的項目變成一個更有組織的團體成就.ZeevSuraski和AndiGutmans重寫了解析器。這個新的解析器成為PHP版本3的基礎。許多有用的代碼從PHP/FI繼承到PHP3,並且很多是完全重寫的。
今天(1999年年中)不管是PHP/FI或PHP3與很多商業產品捆綁在一塊,例如C2級強度的Web伺服器和紅帽子Linux.根據NetCraft提供的數據推斷,保守估計全世界應用PHP的網站已超過150,000個。由此看來,它比在網際網路上運行Netscape的旗艦企業伺服器的站點還多。

特點


公共網關介面 CGI程序是存放在HTTP伺服器上,為用戶和HTTP伺服器之外的其他應用程序提供互相“交談”手段的軟體,其特點是:
公共(Common)。無須考慮客戶機和伺服器所運行的操作系統平台,只要二者的網關程序遵循同一數據傳輸協議,即可進行數據交互。
網關(Gateway)。CGI可被用來作為HTTP伺服器與其他第三方應用程序之間的“連接件”或“中件(MiddleWare)"。
介面(Interface)。CGI使用標準通訊機制,為其它應用程序與HTTP伺服器提供數據傳輸介面。用CGI可以實現處理表格,資料庫查詢,發送電子郵件或控制伺服器端硬體等許多操作。
CGI進程是根據WWW服務設置的環境變數和傳入參數採取動作並生成相應的響應結果。它返回給WWW伺服器的信息則採用協議規定的格式(一般為MIME規定的格式)。絕大多數Web伺服器支持CGI。
按照數據通信方式的不同,CGI可分為標準CGI和緩衝CGI。幾乎所有的Web伺服器都支持標準CGI。按標準CGI規範編製的外部程序並依賴於特定的Web伺服器平台,而按緩衝CGI規範編製的外部程序則依賴於特定的Web伺服器平台。

注意的問題


CGI應用程序運行在瀏覽器可以請求的伺服器系統上,執行時需要使用伺服器CPU時間和內存。如果有成千上萬的這種程序會同時運行,那會對伺服器系統提出極高的要求。你要慎重考慮這個問題,以防止伺服器系統崩潰。
不完善的CGI應用程序可能成為別人非法進人伺服器系統的通道,有可能導致重要的資料被刪除或外泄。CGI應用程序主要的用途有以下幾種:
根據瀏覽者填寫的HTML表單發送定製的答覆;
創建可單擊的圖像縮小圖;
創建一個瀏覽者可以搜索內容的資料庫;
提供伺服器與資料庫的介面,並把結果轉換成HTML文檔;
製作動態HTML文擋。
如果一個CGI腳本可以在每台計算機上做同樣的事情;編寫腳本就會變的很容易。不幸的是,CGI腳本依賴於伺服器的操作系統,因此,對於非UNIX伺服器來說,Prl(UNIX下編寫腳本的一個常用工具)腳本毫無用處。所以,你必須定製安裝你的CGI腳本。
大多數伺服器都提供CGI-BIN目錄,但是這還不夠。因為你應該擁有自己的CGI-BIN。這樣,你就能運行自己的腳本(而不是讓自己的系統去適應已存在於系統上的腳本)。因此,你的提供商應安裝CGI-BIN,且能夠幫助你編寫腳本。

途徑


ASP(ActiveServerPages):活動伺服器頁面,就是一個編程環境,在其中,可以混合使用HTML、腳本語言以及組件來創建伺服器端功能強大的Internet應用程序。如果你以前創建過一個站點,其中混合了HTML、腳本語言以及組件,你就可以在其中加入ASP程序代碼。通過在HTML頁面中加入腳本命令,你可以創建一個HTML用戶界面,並且,還可以通過使用組件包含一些商業邏輯規則。組件可以被腳本程序調用,也可以由其他的組件調用。
ASP的工作原理:
當在Web站點中融入ASP功能后,將發生以下事情:
1、用戶調出站點內容,默認頁面的擴展名是.asp。
2、瀏覽器從伺服器上請求ASP文件。
3、伺服器端腳本開始運行ASP。
4、ASP文件按照從上到下的順序開始處理,執行腳本命令,執行HTML頁面內容。
5、頁面信息發送到瀏覽器。
因為腳本是在伺服器端運行的,所以Web伺服器完成所有處理后,將標準的HTML頁面送往瀏覽器。這意味著,ASP只能在可以支持的伺服器上運行。讓腳本駐留在伺服器端的另外一個益處是:用戶不可能看到原始腳本程序的代碼,用戶看到的,僅僅是最終產生的HTML內容。
PHP:HypertextPreprocessor
PHP是一種伺服器端的,嵌入HTML的腳本語言。PHP區別其他像客戶端Javascript的地方是它的代碼在伺服器端執行.PHP能做什麼?
最低水平,PHP可以做任何其他CGI程序所能做的事,例如收集表格數據,生成動態頁面內容,或者收發cookies.可能最強大,最有意義的特性是PHP支持大範圍的資料庫。書寫一個支持資料庫的Web頁面是難以置信的簡單。
下面是當前支持的資料庫:
AdabasDInterBaseSolid
dBasemSQLSybase
EmpressMySQLVelocis
FileProOracleUnixdbm
InformixPostgreSQL
PHP通過協議也支持與其他服務的"交談",像IMAP、SNMP、NNTP、POP3,甚至是HTTP。你也可以打開晦澀的網路介面和其他協議交互。
PHP的簡要歷史
1994年秋季,RasmusLerdorf開始構思PHP。早期的非發行版本被用在他的主頁上,以追蹤誰在看他的在線簡歷。1995年年初第一版本出台,當時PHP只被認為是個人主頁開發工具。它由一個非常單純的只能理解很少數特殊宏的分析引擎和一些用在主頁後端通用的工具組成,如留言簿,計數器和其他一些東西。這個分析器在1995年年中被重寫並被命名為PHP/FI第二版。FI來自Rasmus寫的另外一個包,用於解釋html形式的數據.他結合了個人主頁工具腳本和形式解析器,並加上mSQL支持.這樣就產生PHP/FI了.PHP/FI以令人驚奇的步調成長,人們開始把自己的代碼貢獻給它。
很難給出它的硬統計表,但可以估計在1996年末,整個世界至少有15,000個網站在用PHP/FI。到1997年年中,這個數字已經超過50,000了,而在此時PHP的發展也發生了變化。由Rasmus自己偏愛的和幾個人開發的項目變成一個更有組織的團體成就。ZeevSuraski和AndiGutmans重寫了解析器。這個新的解析器成為PHP版本3的基礎。許多有用的代碼從PHP/FI繼承到PHP3,並且很多是完全重寫的。
不管是PHP/FI或PHP3與很多商業產品捆綁在一塊,例如C2級強度的Web伺服器和紅帽子Linux。根據NetCraft提供的數據推斷,保守估計全世界應用PHP的網站已超過150,000個。由此看來,它比在網際網路上運行Netscape的旗艦企業伺服器的站點還多。