CGI
簡介
CGI全稱是通用網(wǎng)關(guān)接口(Common Gateway Interface)闸盔,是外部應(yīng)用程序與與服務(wù)器之間的接口標(biāo)準(zhǔn),是在CGI程序和web服務(wù)器之間傳遞信息的規(guī)程琳省。
在物力層面上迎吵、CGI是一段程序,運(yùn)行在服務(wù)器上针贬。
CGI可以用任意語言編寫击费,主要這種語言具有標(biāo)準(zhǔn)輸入、輸出和環(huán)境變量
FastCGI
簡介
FastCGI是一個可伸縮地桦他、高速地在HTTP server和動態(tài)腳本語言間通信的接口荡灾。多數(shù)流行的HTTP server都支持FastCGI,包括Apache瞬铸、Nginx和lighttpd等批幌,同時,F(xiàn)astCGI也被許多腳本語言所支持嗓节,其中就有PHP荧缘。
FastCGI是從CGI發(fā)展改進(jìn)而來的。傳統(tǒng)CGI接口方式的主要缺點(diǎn)是性能很差拦宣,因?yàn)槊看蜨TTP服務(wù)器遇到動態(tài)程序時都需要重新啟動腳本解析器來執(zhí)行解析截粗,然后結(jié)果被返回給HTTP服務(wù)器信姓。這在處理高并發(fā)訪問時,幾乎是不可用的绸罗。另外傳統(tǒng)的CGI接口方式安全性也很差意推,現(xiàn)在已經(jīng)很少被使用了。
FastCGI接口方式采用C/S結(jié)構(gòu)珊蟀,可以將HTTP服務(wù)器和腳本解析服務(wù)器分開菊值,同時在腳本解析服務(wù)器上啟動一個或者多個腳本解析守護(hù)進(jìn)程。當(dāng)HTTP服務(wù)器每次遇到動態(tài)程序時育灸,可以將其直接交付給FastCGI進(jìn)程來執(zhí)行腻窒,然后將得到的結(jié)果返回給瀏覽器。這種方式可以讓HTTP服務(wù)器專一地處理靜態(tài)請求或者將動態(tài)腳本服務(wù)器的結(jié)果返回給客戶端磅崭,這在很大程度上提高了整個應(yīng)用系統(tǒng)的性能儿子。
原理
- Web Server啟動時載入FastCGI進(jìn)程管理器(IIS ISAPI或Apache Module)
- FastCGI進(jìn)程管理器自身初始化,啟動多個CGI解釋器進(jìn)程(可見多個php-cgi)并等待來自Web Server的連接砸喻。
- 當(dāng)客戶端請求到達(dá)Web Server時柔逼,F(xiàn)astCGI進(jìn)程管理器選擇并連接到一個CGI解釋器。Web server將CGI環(huán)境變量和標(biāo)準(zhǔn)輸入發(fā)送到FastCGI子進(jìn)程php-cgi割岛。
- FastCGI子進(jìn)程完成處理后將標(biāo)準(zhǔn)輸出和錯誤信息從同一連接返回Web Server卒落。當(dāng)FastCGI子進(jìn)程關(guān)閉連接時,請求便告處理完成蜂桶。FastCGI子進(jìn)程接著等待并處理來自FastCGI進(jìn)程管理器(運(yùn)行在Web Server中)的下一個連接。 在CGI模式中也切,php-cgi在此便退出了扑媚。
PHP-CGI
簡介
PHP-CGI是php自帶的Fast-CGI管理器。
PHP-CGI的不足:
- php-cgi變更php.ini配置后需重啟php-cgi才能讓新的php-ini生效雷恃,不可以平滑重啟疆股。
- 直接殺死php-cgi進(jìn)程,php就不能運(yùn)行了倒槐。(PHP-FPM和Spawn-FCGI就沒有這個問題旬痹,守護(hù)進(jìn)程會平滑從新生成新的子進(jìn)程。)
PHP-FPM
簡介
- PHP-FPM是一個PHP FastCGI的管理器讨越,他是能夠調(diào)度php-cgi進(jìn)程的程序两残。
- 修改php.ini之后,php-cgi進(jìn)程的確沒辦法平滑重啟把跨,但php-fpm對此的應(yīng)對方法是新的進(jìn)程用新的配置人弓,已經(jīng)存在的進(jìn)程讓按照之前的配置執(zhí)行到結(jié)束。用這種方式進(jìn)行平滑過渡着逐。
- PHP-fpm就是針對于PHP的崔赌,F(xiàn)astcgi的一種實(shí)現(xiàn)意蛀,他負(fù)責(zé)管理一個進(jìn)程池,來處理來自Web服務(wù)器的請求健芭。目前县钥,PHP-fpm是內(nèi)置于PHP的