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