1. 程式人生 > >通用閘道器介面——CGI

通用閘道器介面——CGI

寫部落格的目的是為了自己學習和複習,許多解釋來自於網上大牛,文章非原創。能幫助到別人當然更好不過,水平有限,可能有許多錯誤,歡迎指正。

在我準備找工作之間,從來沒有聽說過CGI,瞭解之後,竟然發現原來web技術不只有PHP、JavaEE/JSP、.NET/ASP、Ruby on rails、Python的Django等等。還可以用C/C++。很久以前,那時還沒有動態網頁語言,要實現動態網站需要依賴CGI。在我認為,CGI是web技術發展的一個歷史程序之一,可能已經out了(我粗鄙的認為,不代表其他人和事實)。

什麼是CGI?

CGI 全稱為Common Gateway Interface (通用閘道器介面),目的是能夠讓伺服器能夠方便的呼叫外部程式。CGI本身是一套協議和規範,原則上只要是擁有讀寫檔案功能的程式語言都可以用來編寫CGI程式,例如C,C++,Perl,Visual Basic,Shell等等,歷史上用來編寫CGI程式使用最廣泛的是Perl語言,連PHP一開始也是用Perl編寫的,估計也受這個傳統的影響。伺服器在認為這是一個CGI請求時,會呼叫相關CGI程式,並通過環境變數和標準輸出將資料傳送給CGI程式,CGI程式處理完資料,生成html,然後再通過標準輸出將內容返回給伺服器,伺服器再將內容交給使用者,CGI程序退出,在這個過程中,伺服器的標準輸出對應了CGI程式的標準輸入,CGI程式的標準輸出對應著伺服器的標準輸入,相當於利用兩條管道建立了程序間的通訊。

以上是大佬的解釋,很受用。簡單點說CGI是一套協議和規範,帶來的結果是CGI程式。客戶端通過URL請求一個CGI程式時,伺服器將根據請求不同啟動不同的外部程式,並將請求內容轉發給該程式,在程式執行結束後,將執行結果作為迴應返回給客戶端。對於每個請求,都要產生一個新的程序進行處理。因為每個程序都會佔有很多伺服器的資源和時間,這就導致伺服器無法同時處理很多的併發請求。 這裡寫圖片描述

Servlet 與 CGI 的比較

對比一:當用戶瀏覽器發出一個Http/CGI的請求,或者說 呼叫一個CGI程式的時候,伺服器端就要新啟用一個程序 (而且是每次都要呼叫),呼叫CGI程式越多(特別是訪問量高的時候),就要消耗系統越多的處理時間,只剩下越來越少的系統資源,對於使用者來說,只能是漫長的等待伺服器端的返回頁面了,這對於電子商務激烈發展的今天來說,不能不說是一種技術上的遺憾。 而Servlet充分發揮了伺服器端的資源並高效的利用。每次呼叫Servlet時並不是新啟用一個程序 ,而是在一個Web伺服器的程序敏感詞享和分離執行緒,而執行緒最大的好處在於可以共享一個數據源,使系統資源被有效利用。 對比二:

傳統的CGI程式,不具備平臺無關性特徵,系統環境發生變化,CGI程式就要癱瘓,而Servlet具備Java的平臺無關性,在系統開發過程中保持了系統的可擴充套件性、高效性。 對比三:傳統技術中,一般大都為二層的系統架構,即Web伺服器+資料庫伺服器,導致網站訪問量大的時候,無法克服CGI程式與資料庫建立連線時速度慢的瓶頸,從而宕機、資料庫死鎖現象頻繁發生。而我們的Servlet有連線池的概念,它可以利用多執行緒的優點,在系統快取中事先建立好若干與資料庫的連線,到時候若想和資料庫打交道可以隨時跟系統”要”一個連線即可,反應速度可想而知。