先講下cgi: cgi在2000年或更早的時候用得比較多, 以前web服務(wù)器一般只處理靜態(tài)的請求,如果碰到一個動態(tài)請求怎么辦呢?web服務(wù)器會根據(jù)這次請求的內(nèi)容,然后會fork一個新進(jìn)程來運(yùn)行外部c程序 (或perl腳本...), 這個進(jìn)程會把處理完的數(shù)據(jù)返回給web服務(wù)器,最后web服務(wù)器把內(nèi)容發(fā)送給用戶,剛才fork的進(jìn)程也隨之退出。 如果下次用戶還請求改動態(tài)腳本,那么web服務(wù)器又再次fork一個新進(jìn)程,周而復(fù)始的進(jìn)行。 后來出現(xiàn)了一種更高級的方式是, web服務(wù)器可以內(nèi)置perl解釋器或php解釋器。 也就是說這些解釋器做成模塊的方式,web服務(wù)器會在啟動的時候就啟動這些解釋器。 當(dāng)有新的動態(tài)請求進(jìn)來時,web服務(wù)器就是自己解析這些perl或php腳本,省得重新fork一個進(jìn)程,效率提高了。 fastcgi的方式是,web服務(wù)器收到一個請求時,他不會重新fork一個進(jìn)程(因為這個進(jìn)程在web服務(wù)器啟動時就開啟了,而且不會退 出),web服務(wù)器直接把內(nèi)容傳遞給這個進(jìn)程(進(jìn)程間通信,但fastcgi使用了別的方式,tcp方式通信),這個進(jìn)程收到請求后進(jìn)行處理,把結(jié)果返回 給web服務(wù)器,最后自己接著等待下一個請求的到來,而不是退出。 fastcgi跟cgi的區(qū)別是: 在web服務(wù)器方面 在對數(shù)據(jù)進(jìn)行處理的進(jìn)程方面 cgi fork一個新的進(jìn)程進(jìn)行處理 讀取參數(shù),處理數(shù)據(jù),然后就結(jié)束生命期 fastcgi 用tcp方式跟遠(yuǎn)程機(jī)子上的進(jìn)程或本地進(jìn)程建立連接 要開啟tcp端口,進(jìn)入循環(huán),等待數(shù)據(jù)的到來,處理數(shù)據(jù) 舉個例子: 服務(wù)端現(xiàn)在有個10萬個字單詞, 客戶每次會發(fā)來一個字符串,問以這個字符串為前綴的單詞有多少個。 那么可以寫一個程序,這個程序會建一棵trie樹,然后每次用戶請求過來時可以直接到這個trie去查找。 但是如果以cgi的方式的話,這次請求結(jié)束后這課trie也就沒了,等下次再啟動該進(jìn)程時,又要新建一棵trie樹,這樣的效率就太低下了。 而用fastcgi的方式的話,這課trie樹在進(jìn)程啟動時建立,以后就可以直接在trie樹上查詢指定的前綴了。
|