1. 程式人生 > >fastcgi與cgi的區別

fastcgi與cgi的區別

web服務 這樣的 解釋 處理 for 模塊 內容 請求 出現

fastcgi與cgi的區別

先講下cgi:
cgi在2000年或更早的時候用得比較多, 以前web服務器一般只處理靜態的請求,如果碰到一個動態請求怎麽辦呢?web服務器會根據這次請求的內容,然後會fork一個新進程來運行外部c程序(或perl腳本...), 這個進程會把處理完的數據返回給web服務器,最後web服務器把內容發送給用戶,剛才fork的進程也隨之退出。 如果下次用戶還請求改動態腳本,那麽web服務器又再次fork一個新進程,周而復始的進行。

後來出現了一種更高級的方式是, web服務器可以內置perl解釋器或php解釋器。 也就是說這些解釋器做成模塊的方式,web服務器會在啟動的時候就啟動這些解釋器。 當有新的動態請求進來時,web服務器就是自己解析這些perl或php腳本,省得重新fork一個進程,效率提高了。

fastcgi的方式是,web服務器收到一個請求時,他不會重新fork一個進程(因為這個進程在web服務器啟動時就開啟了,而且不會退出),web服務器直接把內容傳遞給這個進程(進程間通信,但fastcgi使用了別的方式,tcp方式通信),這個進程收到請求後進行處理,把結果返回給web服務器,最後自己接著等待下一個請求的到來,而不是退出。
fastcgi跟cgi的區別是:
在web服務器方面 在對數據進行處理的進程方面
cgi fork一個新的進程進行處理 讀取參數,處理數據,然後就結束生命期
fastcgi

用tcp方式跟遠程機子上的進程或本地進程建立連接 要開啟tcp端口,進入循環,等待數據的到來,處理數據


舉個例子: 服務端現在有個10萬個字單詞, 客戶每次會發來一個字符串,問以這個字符串為前綴的單詞有多少個。 那麽可以寫一個程序,這個程序會建一棵trie樹,然後每次用戶請求過來時可以直接到這個trie去查找。 但是如果以cgi的方式的話,這次請求結束後這課trie也就沒了,等下次再啟動該進程時,又要新建一棵trie樹,這樣的效率就太低下了。 而用fastcgi的方式的話,這課trie樹在進程啟動時建立,以後就可以直接在trie樹上查詢指定的前綴了。

原文地址:http://www.cnblogs.com/lmule/archive/2010/12/09/1900914.html

fastcgi與cgi的區別