知識(shí)庫(kù)
CGI是什么?比如以前的Web服務(wù)器,只能響應(yīng)瀏覽器發(fā)來的HTTP靜態(tài)資源的請(qǐng)求,并將存儲(chǔ)在服務(wù)器中的靜態(tài)資源返回給瀏覽器。隨著Web技術(shù)的發(fā)展,逐漸出現(xiàn)了動(dòng)態(tài)技術(shù),但是Web服務(wù)器并不能夠直接運(yùn)行動(dòng)態(tài)腳本,為了解決Web服務(wù)器與外部應(yīng)用程序(CGI程序)之間數(shù)據(jù)互通,于是出現(xiàn)了CGI(Common Gateway Interface)通用網(wǎng)關(guān)接口。服務(wù)器內(nèi)的數(shù)據(jù)通過CGI轉(zhuǎn)換傳輸?shù)絯eb瀏覽器上去并顯示出來的,所以CGI這個(gè)應(yīng)用程序就是在大家開展業(yè)務(wù)的過程中數(shù)據(jù)傳輸?shù)臉蛄骸?
CGIweb服務(wù)器:http://www.bxgb88.com/
1、CGI的作用
CGI是Web服務(wù)器和一個(gè)獨(dú)立的進(jìn)程之間的協(xié)議,它會(huì)把HTTP請(qǐng)求Request的Header頭設(shè)置成進(jìn)程的環(huán)境變量,HTTP請(qǐng)求的Body正文設(shè)置成進(jìn)程的標(biāo)準(zhǔn)輸入,進(jìn)程的標(biāo)準(zhǔn)輸出設(shè)置為HTTP響應(yīng)Response,包含Header頭和Body正文。
CGI在web服務(wù)的業(yè)務(wù)開展中,是橋梁的作用,有著數(shù)據(jù)轉(zhuǎn)化以及傳輸?shù)淖饔谩⑦€有著保存用戶信息以及上傳的作用,還能在客戶搜索的時(shí)候提供一個(gè)小型數(shù)據(jù)庫(kù)的作用。這些功能在大家的業(yè)務(wù)開展中是不可缺少的。
2、CGI 程序
CGI只是一個(gè)接口規(guī)范或協(xié)議,它的實(shí)現(xiàn)則與具體的編程語言相關(guān)。在2000年以前,CGI通用網(wǎng)關(guān)接口盛行,那個(gè)時(shí)候,Perl是編寫CGI的主流語言,以至于一般的CGI程序都是Perl程序。
通過CGI接口,Web服務(wù)器就能夠獲取客戶端傳遞的數(shù)據(jù),并轉(zhuǎn)交給服務(wù)器端的CGI程序處理,然后返回結(jié)果給客戶端。簡(jiǎn)單來說,CGI實(shí)際上是一個(gè)接口標(biāo)準(zhǔn)。而通常所說的CGI指代其實(shí)是CGI程序,也就是實(shí)現(xiàn)了CGI接口標(biāo)準(zhǔn)的程序,只要編程語言具有標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和環(huán)境變量,就可以用來編寫CGI程序。
CGI程序通過標(biāo)準(zhǔn)輸入(STDIN)和標(biāo)準(zhǔn)輸出(STDOUT)進(jìn)行數(shù)據(jù)的輸入輸出,此外CGI程序還通過環(huán)境變量來得到輸入,操作系統(tǒng)提供了許多環(huán)境變量,它們定義了程序的執(zhí)行環(huán)境,應(yīng)用程序可以存取它們。Web服務(wù)器和CGI接口又另外設(shè)置了一些環(huán)境變量,用來向CGI程序傳遞一些重要的參數(shù)。CGI的GET方法還通過環(huán)境變量QUERY_STRING向CGI程序傳遞Form表單中的數(shù)據(jù)。
對(duì)于一個(gè)CGI程序,主要的工作是從環(huán)境變量和標(biāo)準(zhǔn)輸入中讀取數(shù)據(jù),然后處理數(shù)據(jù),最后向標(biāo)準(zhǔn)輸出中輸出數(shù)據(jù)。
3、環(huán)境變量
環(huán)境變量中存儲(chǔ)的叫做Request Meta-Variables,也就是諸如QUERY_STRING、PATH_INFO之類的,這些都是由Web服務(wù)器通過環(huán)境變量傳遞給CGI程序的,CGI程序也是從環(huán)境變量中讀取的。
4、標(biāo)準(zhǔn)輸出
中存放的往往是用戶通過PUTS或POST提交的數(shù)據(jù),這些數(shù)據(jù)也是由Web服務(wù)器傳遞過來的。
為了處理動(dòng)態(tài)請(qǐng)求,Web服務(wù)器會(huì)根據(jù)請(qǐng)求的內(nèi)容,F(xiàn)ork創(chuàng)建一個(gè)新進(jìn)程來運(yùn)行外部C程序或Perl腳本等,這個(gè)進(jìn)程會(huì)把處理完的數(shù)據(jù)返回給Web服務(wù)器,然后Web服務(wù)器把內(nèi)容發(fā)送給用戶,F(xiàn)ork創(chuàng)建出來的進(jìn)程也會(huì)隨之退出。如果下次用戶請(qǐng)求為動(dòng)態(tài)腳本,那么Web服務(wù)器會(huì)再次Fork創(chuàng)建一個(gè)新進(jìn)程,如此周而復(fù)始的運(yùn)行。
以Nginx接收HTTP請(qǐng)求為例,Nginx接收一個(gè)HTTP請(qǐng)求后Fork創(chuàng)建出一個(gè)進(jìn)程,將HTTP請(qǐng)求帶來的參數(shù)作為輸入,執(zhí)行完程序處理后輸出,最終會(huì)摧毀這個(gè)Fork出來的進(jìn)程,并將輸出返回給客戶端。這種方式雖然簡(jiǎn)單,但是需要不斷地Fork進(jìn)程和銷毀進(jìn)程。
5、CGI程序的工作原理
Web服務(wù)器一般只用來處理靜態(tài)文件請(qǐng)求,一旦碰到動(dòng)態(tài)腳本請(qǐng)求,Web服務(wù)器主進(jìn)程就會(huì)Fork創(chuàng)建出一個(gè)新的進(jìn)程來啟動(dòng)CGI程序,也就是將動(dòng)態(tài)腳本交給CGI程序來處理。啟動(dòng)CGI程序需要一個(gè)過程,如讀取配置文件、加載擴(kuò)展等。當(dāng)CGI程序啟動(dòng)后會(huì)去解析動(dòng)態(tài)腳本,然后將結(jié)果返回給Web服務(wù)器,最后由Web服務(wù)器將結(jié)果返回給客戶端,之前Fork出來的進(jìn)程也隨之關(guān)閉。這樣,每次用戶請(qǐng)求動(dòng)態(tài)腳本,Web服務(wù)器都要重新Fork創(chuàng)建一個(gè)新進(jìn)程去啟動(dòng)CGI程序,由CGI程序來處理動(dòng)態(tài)腳本,處理完成后進(jìn)程隨之關(guān)閉,其效率是非常低下的。
PHP-CGI
CGI是一個(gè)協(xié)議,PHP語言對(duì)CGI接口規(guī)范的實(shí)現(xiàn)也就是PHP-CGI,也就是PHP的解釋器。隨著技術(shù)的發(fā)展,PHP-CGI的性能問題逐漸暴露,不是那么盡如人意。PHP在運(yùn)行的時(shí)候是依賴配置文件php.ini的,所以每當(dāng)PHP-CGI開始工作的時(shí)候,它完全是一個(gè)新進(jìn)程,需要重新加載PHP配置文件并初始化,這就造成了很大的資源和時(shí)間的浪費(fèi)。
每當(dāng)客戶端請(qǐng)求CGI時(shí),Web服務(wù)器就會(huì)請(qǐng)求操作系統(tǒng)生成一個(gè)新的CGI解釋器進(jìn)程php-cgi.exe,CGI的一個(gè)進(jìn)程處理完一個(gè)請(qǐng)求后退出,下一個(gè)請(qǐng)求來時(shí)在先操作系統(tǒng)申請(qǐng)創(chuàng)建新進(jìn)程。在訪問量較少?zèng)]有并發(fā)的情況下這樣做是沒有問題的,一旦出現(xiàn)訪問量增大,并發(fā)出現(xiàn)時(shí)這種方式就不再合適了,于是便出現(xiàn)了FastCGI。
6、CGI的優(yōu)點(diǎn)
除了在業(yè)務(wù)開展中傳輸數(shù)據(jù)的作用,在web服務(wù)的用戶訪問方面,因?yàn)閔tml無法直接記住客戶信息,而在業(yè)務(wù)開展的過程中是可以記錄用戶信息的,這也是CGI的功勞,所以CGI還可以很好的記住并把客戶的訪問信息傳輸?shù)絯eb服務(wù)器中去。讓大家能夠?qū)崟r(shí)查看到web服務(wù)的客戶訪問情況,并及時(shí)作出調(diào)整,以便于更好的開展web服務(wù)。其次還有許多html無法提供的功能都是通過CGI補(bǔ)充完美的,如可以當(dāng)作一個(gè)計(jì)數(shù)器、搜索程序、web數(shù)據(jù)庫(kù)等等。并且在編寫CGI應(yīng)用程序時(shí),CGI可以通過多種編寫語言來編寫,如C、C++、jave等等,讓大家不必在編寫CGI腳本方面特地的去學(xué)習(xí)某種語言。