cgi是什么,cgi源碼下載
搜索一下CGI的定義
Common Gateway Interface,簡(jiǎn)稱(chēng)CGI。在物理上是一段程序,運(yùn)行在服務(wù)器上,提供同客戶(hù)端 HTML頁(yè)面的接口
“通用網(wǎng)關(guān)接口”,這就是CGI的中文意思。也沒(méi)人規(guī)定CGI一定是用PERL寫(xiě)的。
換句話(huà),只要是提供HTML的服務(wù)器端程序都可以叫CGI,APS、PHP、JSP這些都是,你用C語(yǔ)言寫(xiě)一個(gè)可以提供HTML的服務(wù)器端EXE文件,也叫CGI。
雖然CGI已經(jīng)很少使用了,但是部分網(wǎng)站還在使用CGI的程序,比如一些老論壇,國(guó)外論壇程序都使用的CGI語(yǔ)言編寫(xiě)的程序,那么下面我們?cè)趤?lái)多認(rèn)識(shí)他:
不過(guò)現(xiàn)在互聯(lián)網(wǎng)上用Perl寫(xiě)CGI的倒是很少,開(kāi)發(fā)效率確實(shí)不高,如果不是因?yàn)椴粫?huì)用PHP我也不會(huì)用的。
不過(guò)在需要高性能的web渲染上,c寫(xiě)的cgi handler還是挺廣泛的,例如搜索引擎前端
- 多媒體處理的時(shí)候用C/C++寫(xiě)的CGI處理效率比其它語(yǔ)言效率高太多。
- 現(xiàn)在越來(lái)越多WEB服務(wù)與開(kāi)發(fā)者都開(kāi)始喜歡用REST,內(nèi)網(wǎng)里面使用REST+HTTP GET的方式也更加易于使用。所以,從這方面來(lái)說(shuō),CGI比起其它調(diào)用方式感覺(jué)還是易操作很多。
- 取代HTTP的技術(shù)個(gè)人感覺(jué)要么過(guò)于復(fù)雜,要么不夠成熟。也許 WebSocket以后會(huì)是個(gè)趨勢(shì)。但CGI也極易于擴(kuò)展,易于接入其它服務(wù)端應(yīng)用。
CGI接口原理及實(shí)現(xiàn)(2012-12-7 Over)
1.CGI定義:
CGI(CommonGateway Interface)是HTTP服務(wù)器與你的或其它機(jī)器上的程序進(jìn)行“交談”的一種工具,其程序須運(yùn)行在網(wǎng)絡(luò)服務(wù)器上。
2.CGI功能:
絕大多數(shù)的CGI程序被用來(lái)解釋處理來(lái)自表單的輸入信息,并在服務(wù)器產(chǎn)生相應(yīng)的處理,或?qū)⑾鄳?yīng)的信息反饋給瀏覽器。CGI程序使網(wǎng)頁(yè)具有交互功能。
3.CGI運(yùn)行環(huán)境:
CGI程序在UNIX操作系統(tǒng)上CERN或NCSA格式的服務(wù)器上運(yùn)行。 在其它操作系統(tǒng)(如:windows NT及windows95等)的服務(wù)器上 也廣泛地使用CGI程序,同時(shí)它也適用于各種類(lèi)型機(jī)器。
4.CGI處理步驟:
⑴通過(guò)Internet把用戶(hù)請(qǐng)求送到服務(wù)器。
⑵服務(wù)器接收用戶(hù)請(qǐng)求并交給CGI程序處理。
⑶CGI程序把處理結(jié)果傳送給服務(wù)器。
⑷服務(wù)器把結(jié)果送回到用戶(hù)。
5.CGI服務(wù)器配置:
在許多服務(wù)器cgi-bin是僅能夠放置CGI腳本的目錄。
在Windows平臺(tái)上將C或C++寫(xiě)好的程序的Debug或Release版本的.exe程序拷貝到cgi-bin的目錄下(如上圖所示),將.exe改為.cgi也可同樣運(yùn)行,如下2個(gè)圖。
? ? ? ?cgi-bin目錄是存放CGI腳本的地方。這些腳本使WWW服務(wù)器和瀏覽器能運(yùn)行外部程序,而無(wú)需啟動(dòng)另一個(gè)程序。它是運(yùn)行在Web服務(wù)器上的一個(gè)程序,并由來(lái)自于瀏覽者的輸入觸發(fā)。
CGI程序不是放在服務(wù)器上就能順利運(yùn)行,如果要想使其在服務(wù)器上順利的運(yùn)行并準(zhǔn)確的處理用戶(hù)的請(qǐng)求,則須對(duì)所使用的服務(wù)器進(jìn)行必要的設(shè)置。
? ? ? ?配置:根據(jù)所使用的服務(wù)器類(lèi)型以及它的設(shè)置把CGI程序放在某一特定的目錄中或使其帶有特定的擴(kuò)展名。
Apache網(wǎng)絡(luò)服務(wù)器配置在/var/www/cgi-bin里(如下圖所示筆者電腦的目錄位置)。C++編譯的可執(zhí)行文件可以轉(zhuǎn)換成擴(kuò)展名為.cgi的文件。
更改初始配置的的方法:
<Directory"/var/www/cgi-bin">
?? AllowOverride None
?? Options ExecCGI
?? Order allow,deny
?? Allow from all
</Directory>
<Directory"/var/www/cgi-bin">
?????????? Options All
</Directory>
6.CGI接口標(biāo)準(zhǔn)包括標(biāo)準(zhǔn)輸入、環(huán)境變量、標(biāo)準(zhǔn)輸出三部分。
|
介紹 |
1.標(biāo)準(zhǔn)輸入 |
CGI程序像其他可執(zhí)行程序一樣,可通過(guò)標(biāo)準(zhǔn)輸入(stdin)從Web服務(wù)器得到輸入信息,如Form中的數(shù)據(jù),這就是所謂的向CGI程序傳遞數(shù)據(jù)的POST方法。這意味著在操作系統(tǒng)命令行狀態(tài)可執(zhí)行CGI程序,對(duì)CGI程序進(jìn)行調(diào)試。POST方法是常用的方法。 |
2.環(huán)境變量 |
操作系統(tǒng)提供了許多環(huán)境變量,它們定義了程序的執(zhí)行環(huán)境,應(yīng)用程序可以存取它們。Web服務(wù)器和CGI接口又另外設(shè)置了自己的一些環(huán)境變量,用來(lái)向CGI程序傳遞一些重要的參數(shù)。CGI的GET方法還通過(guò)環(huán)境變量QUERY-STRING向CGI程序傳遞Form中的數(shù)據(jù)。 |
3.標(biāo)準(zhǔn)輸出 |
CGI程序通過(guò)標(biāo)準(zhǔn)輸出(stdout)將輸出信息傳送給Web服務(wù)器。傳送給Web服務(wù)器的信息可以用各種格式,通常是以純文本或者HTML文本的形式,這樣我們就可以在命令行狀態(tài)調(diào)試CGI程序,并且得到它們的輸出。 |
7.環(huán)境變量
環(huán)境變量是文本串(名字/值對(duì)),可以被OSShell或其他程序設(shè)置 ,也可以被其他程序訪(fǎng)問(wèn)。它們是Web服務(wù)器傳遞數(shù)據(jù)給CGI程序的簡(jiǎn)單手段,之所以稱(chēng)為環(huán)境變量是因?yàn)樗鼈兪侨肿兞?任何程序都可以存取它們。
下面是CGI程序設(shè)計(jì)中常常要用到的一些環(huán)境變量。
環(huán)境變量????????? |
意義 |
SERVER_NAME | CGI腳本運(yùn)行時(shí)的主機(jī)名和IP地址. |
SERVER_SOFTWARE | 你的服務(wù)器的類(lèi)型如: CERN/3.0 或 NCSA/1.3. |
GATEWAY_INTERFACE | 運(yùn)行的CGI版本. 對(duì)于UNIX服務(wù)器, 這是CGI/1.1. |
SERVER_PROTOCOL | 服務(wù)器運(yùn)行的HTTP協(xié)議. 這里當(dāng)是HTTP/1.0. |
SERVER_PORT | 服務(wù)器運(yùn)行的TCP口,通常Web服務(wù)器是80. |
REQUEST_METHOD | POST 或 GET, 取決于你的表單是怎樣遞交的. |
HTTP_ACCEPT | 瀏覽器能直接接收的Content-types, 可以有HTTP Accept header定義. |
HTTP_USER_AGENT | 遞交表單的瀏覽器的名稱(chēng)、版本 和其他平臺(tái)性的附加信息。 |
HTTP_REFERER | 遞交表單的文本的 URL,不是所有的瀏覽器都發(fā)出這個(gè)信息,不要依賴(lài)它 |
PATH_INFO | 附加的路徑信息, 由瀏覽器通過(guò)GET方法發(fā)出. |
PATH_TRANSLATED | 在PATH_INFO中系統(tǒng)規(guī)定的路徑信息. |
SCRIPT_NAME | 指向這個(gè)CGI腳本的路徑, 是在URL中顯示的(如, /cgi-bin/thescript). |
QUERY_STRING | 腳本參數(shù)或者表單輸入項(xiàng)(如果是用GET遞交). QUERY_STRING包含URL中問(wèn)號(hào)后面的參數(shù). |
REMOTE_HOST | 遞交腳本的主機(jī)名,這個(gè)值不能被設(shè)置. |
REMOTE_ADDR | 遞交腳本的主機(jī)IP地址. |
REMOTE_USER | 遞交腳本的用戶(hù)名. 如果服務(wù)器的authentication被激活,這個(gè)值可以設(shè)置。 |
REMOTE_IDENT | 如果Web服務(wù)器是在ident (一種確認(rèn)用戶(hù)連接你的協(xié)議)運(yùn)行, 遞交表單的系統(tǒng)也在運(yùn)行ident, 這個(gè)變量就含有ident返回值. |
CONTENT_TYPE | 如果表單是用POST遞交, 這個(gè)值將是 application/x-www-form-urlencoded. 在上載文件的表單中, content-type 是個(gè) multipart/form-data. |
CONTENT_LENGTH | 對(duì)于用POST遞交的表單,標(biāo)準(zhǔn)輸入口的字節(jié)數(shù). |
REQUEST-METHOD:指的是當(dāng)Web服務(wù)器傳遞數(shù)據(jù)給CGI程序時(shí)所采用的方法,分為GET和POST兩種方法。
【GET和POST方法的區(qū)別】:GET方法僅通過(guò)環(huán)境變量(如QUERY-STRING)傳遞數(shù)據(jù)給CGI程序,而POST方法通過(guò)環(huán)境變量和標(biāo)準(zhǔn)輸入傳遞數(shù)據(jù)給CGI程序,因此POST方法可較方便地傳遞較多的數(shù)據(jù)給CGI程序。
CGI是什么
CGI是CommonGatewayInterface 的簡(jiǎn)稱(chēng)。是一個(gè)用于定Web服務(wù)器與外部程序之間通信方式的標(biāo)準(zhǔn),使得外部程序能生成HTML、圖像或者其他內(nèi)容,而服務(wù)器處理的方式與那些非外部程序生成的HTML、圖像或其他內(nèi)容的處理方式是相同的。因此,CGI程序冊(cè)僅使你能生成表態(tài)內(nèi)容而能生動(dòng)態(tài)內(nèi)容。使用CGI的原因在于它是一個(gè)定義良好并被廣泛支持的標(biāo)準(zhǔn),沒(méi)有CGI就不可能實(shí)現(xiàn)動(dòng)態(tài)的Web頁(yè)面,除非使用一些服務(wù)器中提供的特殊方法(如今,也有除CGI之外的其他技術(shù)逐漸在成為標(biāo)準(zhǔn))。
CGI主要的功能是在WWW環(huán)境下,藉由從客戶(hù)端傳遞一些訊息給WWWServer,再由WWWServer去啟動(dòng)所指定的程式碼來(lái)完成特定的工作。所以更明確的說(shuō),CGI僅是在WWWServer上可執(zhí)行的程式碼,而她的工作就是控制訊息要求而且產(chǎn)生并傳回所需的文件。使用CGI,你的Server可以讀取并顯示在客戶(hù)端無(wú)法讀取的格式(像是SQLDataBase)。而且可以像閘道(Gateway)一樣,在伺服端和客戶(hù)端之間,產(chǎn)生客戶(hù)端所需要的訊息?;旧?,在此種主從式(Client/Server)的環(huán)境之下,其IPC(InterProcess Communication)的協(xié)定是利用訊息傳遞及記憶體分享(環(huán)境變數(shù))的方式來(lái)完成。CGI有其特定的寫(xiě)法及規(guī)格,必須遵守其原則,方可達(dá)到主從端資訊交流的目的。
什么是CGI
- 定義:
CGI(Common Gateway Interface)是HTTP服務(wù)器與你的或其它機(jī)器
上的程序進(jìn)行“交談”的一種工具,其程序須運(yùn)行在網(wǎng)絡(luò)服務(wù)器上。
- 功能:
絕大多數(shù)的CGI程序被用來(lái)解釋處理杰自表單的輸入信息,并在服
務(wù)器產(chǎn)生相應(yīng)的處理,或?qū)⑾鄳?yīng)的信息反饋給瀏覽器。CGI程序使
網(wǎng)頁(yè)具有交互功能。
- 運(yùn)行環(huán)境:
CGI程序在UNIX操作系統(tǒng)上CERN或NCSA格式的服務(wù)器上運(yùn)行。
在其它操作系統(tǒng)(如:windows NT及windows95等)的服務(wù)器上
也廣泛地使用CGI程序,同時(shí)它也適用于各種類(lèi)型機(jī)器。
- CGI處理步驟:
⑴通過(guò)Internet把用戶(hù)請(qǐng)求送到服務(wù)器。
⑵服務(wù)器接收用戶(hù)請(qǐng)求并交給CGI程序處理。
⑶CGI程序把處理結(jié)果傳送給服務(wù)器。
⑷服務(wù)器把結(jié)果送回到用戶(hù)。
- CGI服務(wù)器配置:
CGI程序不是放在服務(wù)器上就能順利運(yùn)行,如果要想使其在服務(wù)器
上順利的運(yùn)行并準(zhǔn)確的處理用戶(hù)的請(qǐng)求,則須對(duì)所使用的服務(wù)器進(jìn)
行必要的設(shè)置。
配置:根據(jù)所使用的服務(wù)器類(lèi)型以及它的設(shè)置把CGI程序放在某一
特定的目錄中或使其帶有特定的擴(kuò)展名。
⑴CREN格式服務(wù)器的配置:
編輯CREN格式服務(wù)器的配置文件通常為/etc/httpd.conf/
在文件中加入:Exec cgi-bin/*/home/www/cgi-bin/*.exec
命令中出現(xiàn)的第一個(gè)參數(shù)cgi-bin/*指出了在URL中出現(xiàn)的目錄
名字,并表示它出
現(xiàn)在系統(tǒng)主機(jī)后的第一個(gè)目錄中,如:
http://edgar.stern.nyn.edu/cgi-bin/
命令中的第二個(gè)參數(shù)表示CGI程序目錄放在系統(tǒng)中的真實(shí)路徑。
CGI目錄除了可以點(diǎn)網(wǎng)絡(luò)文件放在同一目錄中,也可以放在系統(tǒng)
的其它目錄中,但必須保證在你的系統(tǒng)中也具有同樣的目錄。在
對(duì)服務(wù)器完成設(shè)置后,須重新啟動(dòng)服務(wù)器(除非HTTP服務(wù)器是用
inetd啟動(dòng)的)。
⑵NCSA格式服務(wù)器的配置
在NCSA格式服務(wù)器上有兩種方法進(jìn)行設(shè)置:
①在srm.conf文件(通常在conf目錄下)中加入:
Script Alias/cgi-bin/cgi-bin/
Script Alias命令指出某一目錄下的文件是可執(zhí)行程序,且這
個(gè)命令是用來(lái)執(zhí)行
這些程序的;此命令的兩個(gè)參數(shù)與CERN格式服務(wù)器中的Exec命
令的參數(shù)的含意一樣。
②在srm.conf文件加入:
Add type application/x-httpd-cgi.cgi
此命令表示在服務(wù)器上增加了一種新的文件類(lèi)型,其后第一個(gè)
參數(shù)為CGI程序的MIME類(lèi)型,第二個(gè)參數(shù)是文件的擴(kuò)展名,表
示以這一擴(kuò)展名為擴(kuò)展名的文件是CGI程序。
在用上述方法之一設(shè)置服務(wù)器后,都得重新啟動(dòng)服務(wù)器(除非
HTTP服務(wù)器是用inetd啟動(dòng)的)。
CGI是什么
好了,現(xiàn)在我們來(lái)說(shuō)到底什么是CGI。Common Gate Intergace聽(tīng)起來(lái)讓人有些專(zhuān)業(yè), 我們就管它叫CGI好了。在物理上,CGI是一段程序,它運(yùn)行在Server上,提供同客戶(hù)段 Html頁(yè)面的接口。這樣說(shuō)大概還不好理解。那么我們看一個(gè)實(shí)際例子:現(xiàn)在的個(gè)人主頁(yè)上大部分都有一個(gè)留言本。留言本的工作是這樣的:先由用戶(hù)在客戶(hù)段輸入一些信息,如名字之類(lèi)的東西。
接著用戶(hù)按一下“留言”(到目前為止工作都在客戶(hù)端),瀏覽器把這些信息傳送到服務(wù)器的CGI 目錄下特定的cgi程序中,于是cgi程序在服務(wù)器上按照預(yù)定的方法進(jìn)行處理。在本例中就是把用戶(hù)提交的信息存入指定的文件中。然后cgi程序給客戶(hù)端發(fā)送一個(gè)信息,表示請(qǐng)求的任務(wù)已經(jīng)結(jié)束。此時(shí)用戶(hù)在瀏覽器里將看到“留言結(jié)束”的字樣。整個(gè)過(guò)程結(jié)束。
既然CGI是一種程序,自然需要用編程語(yǔ)言來(lái)寫(xiě)。你可以用任何一種你熟悉的高級(jí)語(yǔ)言, C,C++,C shell和VB。值得特別指出的,有一種叫Perl的語(yǔ)言。其前身是屬于Unix專(zhuān)用的高 級(jí)語(yǔ)言,其具有強(qiáng)大的字符串處理能力而成為現(xiàn)在寫(xiě)CGI,特別是表單類(lèi)程序的首選。最近它已經(jīng)有了Window95,和winnt版本。你可以在搜索程序里找到在那里下載它。 VB是Ms的殺手锏,從目前的情況看,微軟公司正試圖使VB無(wú)所不能。自然也包括在Internet 請(qǐng)各位注意,VB開(kāi)發(fā)的程序只能在windows平臺(tái)上被執(zhí)行,所以它有一定局限。 C Shell,經(jīng)典的語(yǔ)言。可惜能做的事情不多,而且必須在Unix平臺(tái)下。 C,C++,正真的無(wú)所不能??墒窃趯?xiě)CGI的時(shí)候顯得非常難以掌握。特別是缺乏可以靈活使用的字符串處理函數(shù)。對(duì)程序員的要求也比較高,維護(hù)復(fù)雜。
最后要提醒各位,因?yàn)镃GI是Server和Clinet的接口,所以對(duì)于不同的Server,CGI程序的移值是一個(gè)很復(fù)雜的問(wèn)題。一般對(duì)于不同的Server,決沒(méi)有兩個(gè)可以互相通用的CGI。實(shí)際上 這就是CGI程序最復(fù)雜的地方。
cgi:common gate interface ,通用網(wǎng)關(guān)接口。
以前網(wǎng)站上的動(dòng)態(tài)功能都是用CGI實(shí)現(xiàn),而寫(xiě)CGI的語(yǔ)言有很多,C也行。最流行的是perp。
后來(lái)sun公司推出了servlet基本上取代了CGI。
后來(lái)又推出了JSP試圖取代servlet。
所以呢,如果不想學(xué)深的話(huà),只學(xué)JSP就行(要先學(xué)JAVA)/。
否則學(xué)完JSP再學(xué)SERVLET。
CGI就不用了,已基本被淘汰。
與傳統(tǒng)的CGI和許多其他類(lèi)似CGI的技術(shù)相比,Java Servlet具有更高的效率,更容易使用,功能更強(qiáng)大,具有更好的可移植性,更節(jié)省投資。在未來(lái)的技術(shù)發(fā)展過(guò)程中,Servlet有可能徹底取代CGI。
在傳統(tǒng)的CGI中,每個(gè)請(qǐng)求都要啟動(dòng)一個(gè)新的進(jìn)程,如果CGI程序本身的執(zhí)行時(shí)間較短,啟動(dòng)進(jìn)程所需要的開(kāi)銷(xiāo)很可能反而超過(guò)實(shí)際執(zhí)行時(shí)間。而在Servlet中,每個(gè)請(qǐng)求由一個(gè)輕量級(jí)的Java線(xiàn)程處理(而不是重量級(jí)的操作系統(tǒng)進(jìn)程)。
在傳統(tǒng)CGI中,如果有N個(gè)并發(fā)的對(duì)同一CGI程序的請(qǐng)求,則該CGI程序的代碼在內(nèi)存中重復(fù)裝載了N次;而對(duì)于Servlet,處理請(qǐng)求的是N個(gè)線(xiàn)程,只需要一份Servlet類(lèi)代碼。在性能優(yōu)化方面,Servlet也比CGI有著更多的選擇。
* 方便
Servlet提供了大量的實(shí)用工具例程,例如自動(dòng)地解析和解碼HTML表單數(shù)據(jù)、讀取和設(shè)置HTTP頭、處理Cookie、跟蹤會(huì)話(huà)狀態(tài)等。
* 功能強(qiáng)大
在Servlet中,許多使用傳統(tǒng)CGI程序很難完成的任務(wù)都可以輕松地完成。例如,Servlet能夠直接和Web服務(wù)器交互,而普通的CGI程序不能。Servlet還能夠在各個(gè)程序之間共享數(shù)據(jù),使得數(shù)據(jù)庫(kù)連接池之類(lèi)的功能很容易實(shí)現(xiàn)。
* 可移植性好
Servlet用Java編寫(xiě),Servlet API具有完善的標(biāo)準(zhǔn)。因此,為IPlanet Enterprise Server寫(xiě)的Servlet無(wú)需任何實(shí)質(zhì)上的改動(dòng)即可移植到Apache、Microsoft IIS或者WebStar。幾乎所有的主流服務(wù)器都直接或通過(guò)插件支持Servlet。
* 節(jié)省投資
不僅有許多廉價(jià)甚至免費(fèi)的Web服務(wù)器可供個(gè)人或小規(guī)模網(wǎng)站使用,而且對(duì)于現(xiàn)有的服務(wù)器,如果它不支持Servlet的話(huà),要加上這部分功能也往往是免費(fèi)的(或只需要極少的投資)。
0 Comments.