入行五六年了,很少提筆寫整塊的博客,近來越發(fā)感覺到了一定的階段,需要去整理一些文字已慰自己逝去的青春。 WEB,不就是那點(diǎn)事嗎? 相信很多同學(xué)都知道,Apache、Tomacat,IIS等web服務(wù)器在運(yùn)行的時(shí)候,會調(diào)用PHP,Java、.Net 等應(yīng)用程序服務(wù)來執(zhí)行具體的對數(shù)據(jù)庫的相關(guān)操作。 那么他們直接具體是什么關(guān)系呢? 又跟CGI有什么關(guān)系呢? ================================================================================ 先來看看CGI是什么玩意。 CGI:通用網(wǎng)關(guān)接口(Common Gateway Interface)是一個Web服務(wù)器主機(jī)提供信息服務(wù)的標(biāo)準(zhǔn)接口。 通過CGI接口,Web服務(wù)器就能夠獲取客戶端提交的信息,轉(zhuǎn)交給服務(wù)器端的CGI程序進(jìn)行處理,最后返回結(jié)果給客戶端。 組成CGI通信系統(tǒng)的是兩部分:一部分是html頁面,就是在用戶端瀏覽器上顯示的頁面。另一部分則是運(yùn)行在服務(wù)器上的Cgi程序。 它們之間的通訊方式如下圖: 那么這里的CGI程序是個什么概念呢? CGI程序就是真正的被服務(wù)器(如Apache)調(diào)用的來處理用戶發(fā)送過來的數(shù)據(jù)的程序。所謂CGI程序就是按照CGI接口規(guī)范編寫的能夠處理用戶通過瀏覽器發(fā)送到服務(wù)器的數(shù)據(jù)的 一個程序。 首先,這個程序必須要按照CGI接口規(guī)范來寫。 前面已經(jīng)說過了,CGI的學(xué)名就是通用網(wǎng)關(guān)接口,我們知道網(wǎng)關(guān)的概念是聯(lián)通一個網(wǎng)絡(luò)和另一個網(wǎng)絡(luò)的通道,那么這里我個人的理解就 是CGI這個網(wǎng)關(guān),是連通web服務(wù)器這個大容器和服務(wù)器上其它資源(如:數(shù)據(jù)庫、文件)的一個通道。為什么需要網(wǎng)關(guān)進(jìn)行連接呢,我們知道根據(jù)web服務(wù)器的設(shè)計(jì)規(guī)范來說, web服務(wù)器只能操作它根目錄下的相關(guān)文件(如:Apache服務(wù)器默認(rèn)只能操作/htdocs 這個目錄下的文件)。那么對于web服務(wù)器以外的資源,如果服務(wù)器想要操作怎么辦呢? 就需要用到CGI這個接口,這個接口定義了web服務(wù)器在操作其權(quán)限范圍以外的資源時(shí)需要遵循的規(guī)范及數(shù)據(jù)傳遞的方式。 有了上面這個理解,我們知道,CGI其實(shí)是一個接口規(guī)范,并且按照CGI接口規(guī)范開發(fā)的程序都可以叫做CGI程序。那么可以用來開發(fā)CGI的程序有哪些呢?C、Java、PHP、 Perl、Asp、.Net等。 用Perl編寫的CGI程序后綴為:.pl;Python編寫的CGI程序后綴為:.py;而C編寫的CGI程序后綴為:.cgi,如果在win下編譯出來的是.exe,最好將它重命名為.cgi。 這些都是為了HTTP服務(wù)能夠識別并調(diào)用它們。 其實(shí)最早的時(shí)候CGI程序是用C語言來編寫的,有興趣的同學(xué)可以參考這篇文章,很不錯http://blog.csdn.net/clearver/article/details/5209332。 后來隨著互聯(lián)網(wǎng)的發(fā)展,逐步又有了豐富多彩的各種新的開發(fā)語言。 那么我們從瀏覽器點(diǎn)擊一個按鈕向服務(wù)器發(fā)起請求這個過程是怎么來處理的呢? 回想一下,我們在表單中有一個叫做Action的屬性,<Form action="xxx">,首先這個請求會被發(fā)送到web服務(wù)器,然后web服務(wù)器根據(jù)你發(fā)過來URL請求找到相對應(yīng)的CGI程 序(如:login.php)。然后web服務(wù)器會把數(shù)據(jù)按照CGI的接口標(biāo)準(zhǔn)傳遞給相應(yīng)的CGI程序,對應(yīng)的CGI程序處理過請求后,會返回?cái)?shù)據(jù),或者文件(一般是HTMl)給服務(wù)器,服務(wù) 器會把結(jié)果返回給瀏覽器,瀏覽器負(fù)責(zé)呈現(xiàn)用戶請求的處理結(jié)果。 這樣一個請求就算完成了,其實(shí)這個過程和我理解的web請求過程沒有太大的區(qū)別,只是這里我在闡述CGI這個概念。 如果有興趣,可以用C來實(shí)現(xiàn)一個CGI程序。 |
|