CGI
一. CGI是什么
CGI吭历,全稱是Common Gateway Interface,翻譯過(guò)來(lái)就是“通用網(wǎng)關(guān)接口”擂橘,定義了一個(gè)接口標(biāo)準(zhǔn)晌区,描述了數(shù)據(jù)怎么在服務(wù)器和外部應(yīng)用程序之間怎么傳遞。
二. CGI的來(lái)歷
在很早之前通贞,互聯(lián)網(wǎng)只有些靜態(tài)內(nèi)容朗若,瀏覽器發(fā)送資源請(qǐng)求,服務(wù)器接受請(qǐng)求并返回服務(wù)器上的靜態(tài)文件即可昌罩。
隨著互聯(lián)網(wǎng)的發(fā)展哭懈,動(dòng)態(tài)內(nèi)容產(chǎn)生了,這些動(dòng)態(tài)內(nèi)容涉及到了數(shù)據(jù)庫(kù)茎用,能夠操作數(shù)據(jù)庫(kù)的動(dòng)態(tài)語(yǔ)言將數(shù)據(jù)處理后返回給WebServer遣总,WebServer再返回給瀏覽器。
由于有很多種動(dòng)態(tài)語(yǔ)言和很多種瀏覽器轨功,它們之間面臨著不兼容的情況旭斥,這時(shí)候就需要在它們之間設(shè)立一個(gè)接口標(biāo)準(zhǔn),這就是CGI古涧。瀏覽器發(fā)起請(qǐng)求垂券,WebServer會(huì)將請(qǐng)求發(fā)給對(duì)應(yīng)的CGI程序,CGI再調(diào)用外部程序來(lái)處理請(qǐng)求并返回結(jié)果羡滑。
三. CGI的作用
WebServer是通過(guò)如下方式來(lái)CGI程序進(jìn)行通信的菇爪,所以只要支持標(biāo)準(zhǔn)輸入輸出和環(huán)境變量的語(yǔ)言卒暂,都能用來(lái)編寫(xiě)CGI程序。
環(huán)境變量(請(qǐng)求類型娄帖,請(qǐng)求IP..)
標(biāo)準(zhǔn)輸入(請(qǐng)求主體)
標(biāo)準(zhǔn)輸出(請(qǐng)求響應(yīng))
CGI描述了如何在環(huán)境變量中傳遞請(qǐng)求的基本信息也祠,如何通過(guò)標(biāo)準(zhǔn)輸入傳遞請(qǐng)求體,以及如何通過(guò)標(biāo)準(zhǔn)輸出來(lái)傳遞輸出近速。這就使編程語(yǔ)言可以很容易得使用環(huán)境變量诈嘿、標(biāo)準(zhǔn)輸入輸出
四. CGI的缺點(diǎn)
WebServer在接收到請(qǐng)求時(shí),會(huì)先f(wàn)ork出CGI進(jìn)程削葱,然后處理請(qǐng)求奖亚,處理完后結(jié)束這個(gè)進(jìn)程,這就是 fork-and-execute 模式析砸。所以用 CGI 方式的服務(wù)器有多少連接請(qǐng)求就會(huì)有多少 CGI 進(jìn)程昔字,每個(gè)進(jìn)程都會(huì)加載解析PHP配置,初始化執(zhí)行環(huán)境首繁,那么當(dāng)高并發(fā)請(qǐng)求時(shí)作郭,會(huì)大量擠占系統(tǒng)的資源如內(nèi)存,CPU 時(shí)間等弦疮,造成效能低下夹攒。
PHP-CGI
PHP-CGI是php的CGI程序,不進(jìn)行進(jìn)程管理
FastCGI
一. FastCGI的簡(jiǎn)介
FastCGI是Web服務(wù)器和處理程序之間通信的一種協(xié)議胁塞, 是CGI的一種改進(jìn)方案咏尝,FastCGI像是一個(gè)常駐(long-lived)型的CGI, 它可以一直執(zhí)行啸罢,在請(qǐng)求到達(dá)時(shí)不會(huì)花費(fèi)時(shí)間去fork一個(gè)進(jìn)程來(lái)處理(這是CGI最為人詬病的fork-and-execute模式)编检。 正是因?yàn)樗皇且粋€(gè)通信協(xié)議,它還支持分布式的運(yùn)算扰才,所以 FastCGI 程序可以在網(wǎng)站服務(wù)器以外的主機(jī)上執(zhí)行允懂,并且可以接受來(lái)自其它網(wǎng)站服務(wù)器的請(qǐng)求。
FastCGI 是與語(yǔ)言無(wú)關(guān)的训桶、可伸縮架構(gòu)的 CGI 開(kāi)放擴(kuò)展累驮,將 CGI 解釋器進(jìn)程保持在內(nèi)存中酣倾,以此獲得較高的性能舵揭。 CGI 程序反復(fù)加載是 CGI 性能低下的主要原因,如果 CGI 程序保持在內(nèi)存中并接受 FastCGI 進(jìn)程管理器調(diào)度躁锡, 則可以提供良好的性能午绳、伸縮性、Fail-Over 特性等映之。
二. FastCGI工作流程
- FastCGI 進(jìn)程管理器自身初始化拦焚,啟動(dòng)多個(gè) CGI 解釋器進(jìn)程蜡坊,并等待來(lái)自 Web Server 的連接。
- Web 服務(wù)器與 FastCGI 進(jìn)程管理器進(jìn)行 Socket 通信赎败,通過(guò) FastCGI 協(xié)議發(fā)送 CGI 環(huán)境變量和標(biāo)準(zhǔn)輸入數(shù)據(jù)給 CGI 解釋器進(jìn)程秕衙。
- CGI 解釋器進(jìn)程完成處理后將標(biāo)準(zhǔn)輸出和錯(cuò)誤信息從同一連接返回 Web Server。
- CGI 解釋器進(jìn)程接著等待并處理來(lái)自 Web Server 的下一個(gè)連接僵刮。
FastCGI 與傳統(tǒng) CGI 模式的區(qū)別之一則是 Web 服務(wù)器不是直接執(zhí)行 CGI 程序了据忘,而是通過(guò) Socket 與 FastCGI 響應(yīng)器(FastCGI 進(jìn)程管理器)進(jìn)行交互,也正是由于 FastCGI 進(jìn)程管理器是基于 Socket 通信的搞糕,所以也是分布式的勇吊,Web 服務(wù)器可以和 CGI 響應(yīng)器服務(wù)器分開(kāi)部署。Web 服務(wù)器需要將數(shù)據(jù) CGI/1.1 的規(guī)范封裝在遵循 FastCGI 協(xié)議包中發(fā)送給 FastCGI 響應(yīng)器程序窍仰。