首先虎韵,CGI是干嘛的亚侠?CGI是為了保證web server傳遞過來的數(shù)據(jù)是標(biāo)準(zhǔn)格式的什往,方便CGI程序的編寫者软能。
web server(比如說nginx)只是內(nèi)容的分發(fā)者迎捺。比如,如果請求/index.html查排,那么web server會(huì)去文件系統(tǒng)中找到這個(gè)文件凳枝,發(fā)送給瀏覽器,這里分發(fā)的是靜態(tài)數(shù)據(jù)跋核。好了岖瑰,如果現(xiàn)在請求的是/index.php,根據(jù)配置文件砂代,nginx知道這個(gè)不是靜態(tài)文件蹋订,需要去找PHP解析器來處理,那么他會(huì)把這個(gè)請求簡單處理后交給PHP解析器刻伊。Nginx會(huì)傳哪些數(shù)據(jù)給PHP解析器呢露戒?url要有吧,查詢字符串也得有吧捶箱,POST數(shù)據(jù)也要有智什,HTTP header不能少吧,好的丁屎,CGI就是規(guī)定要傳哪些數(shù)據(jù)荠锭、以什么樣的格式傳遞給后方處理這個(gè)請求的協(xié)議。仔細(xì)想想悦屏,你在PHP代碼中使用的用戶從哪里來的节沦。
當(dāng)web server收到/index.php這個(gè)請求后,會(huì)啟動(dòng)對(duì)應(yīng)的CGI程序础爬,這里就是PHP的解析器甫贯。接下來PHP解析器會(huì)解析php.ini文件,初始化執(zhí)行環(huán)境看蚜,然后處理請求叫搁,再以規(guī)定CGI規(guī)定的格式返回處理后的結(jié)果,退出進(jìn)程。web server再把結(jié)果返回給瀏覽器渴逻。
好了疾党,CGI是個(gè)協(xié)議,跟進(jìn)程什么的沒關(guān)系惨奕。那fastcgi又是什么呢雪位?Fastcgi是用來提高CGI程序性能的。
提高性能梨撞,那么CGI程序的性能問題在哪呢雹洗?"PHP解析器會(huì)解析php.ini文件,初始化執(zhí)行環(huán)境"卧波,就是這里了时肿。標(biāo)準(zhǔn)的CGI對(duì)每個(gè)請求都會(huì)執(zhí)行這些步驟(不閑累啊港粱!啟動(dòng)進(jìn)程很累的說sΤ伞),所以處理每個(gè)時(shí)間的時(shí)間會(huì)比較長查坪。這明顯不合理嘛寸宏!那么Fastcgi是怎么做的呢?首先偿曙,F(xiàn)astcgi會(huì)先啟一個(gè)master击吱,解析配置文件,初始化執(zhí)行環(huán)境遥昧,然后再啟動(dòng)多個(gè)worker。當(dāng)請求過來時(shí)朵纷,master會(huì)傳遞給一個(gè)worker炭臭,然后立即可以接受下一個(gè)請求。這樣就避免了重復(fù)的勞動(dòng)袍辞,效率自然是高鞋仍。而且當(dāng)worker不夠用時(shí),master可以根據(jù)配置預(yù)先啟動(dòng)幾個(gè)worker等著搅吁;當(dāng)然空閑worker太多時(shí)威创,也會(huì)停掉一些,這樣就提高了性能谎懦,也節(jié)約了資源肚豺。這就是fastcgi的對(duì)進(jìn)程的管理。
那PHP-FPM又是什么呢界拦?是一個(gè)實(shí)現(xiàn)了Fastcgi的程序吸申,被PHP官方收了。
大家都知道,PHP的解釋器是php-cgi截碴。php-cgi只是個(gè)CGI程序梳侨,他自己本身只能解析請求,返回結(jié)果日丹,不會(huì)進(jìn)程管理(皇上走哺,臣妾真的做不到啊U芟骸)所以就出現(xiàn)了一些能夠調(diào)度php-cgi進(jìn)程的程序丙躏,比如說由lighthttpd分離出來的spawn-fcgi。好了PHP-FPM也是這么個(gè)東東妒牙,在長時(shí)間的發(fā)展后彼哼,逐漸得到了大家的認(rèn)可(要知道,前幾年大家可是抱怨PHP-FPM穩(wěn)定性太差的)湘今,也越來越流行敢朱。
總結(jié)
Fastcgi是CGI的升級(jí)版,一種語言無關(guān)的協(xié)議摩瞎,用來溝通程序(如PHP, Python, Java)和Web服務(wù)器(Apache2, Nginx), 理論上任何語言編寫的程序都可以通過Fastcgi來提供Web服務(wù)拴签。
Fastcgi的特點(diǎn)是會(huì)在一個(gè)進(jìn)程中依次完成多個(gè)請求,以達(dá)到提高效率的目的旗们,大多數(shù)Fastcgi實(shí)現(xiàn)都會(huì)維護(hù)一個(gè)進(jìn)程池蚓哩。
而PHP-fpm就是針對(duì)于PHP的,F(xiàn)astcgi的一種實(shí)現(xiàn)上渴,他負(fù)責(zé)管理一個(gè)進(jìn)程池岸梨,來處理來自Web服務(wù)器的請求。目前稠氮,PHP-fpm是內(nèi)置于PHP的曹阔。
但是PHP-fpm僅僅是個(gè)“PHP Fastcgi 進(jìn)程管理器”, 它仍會(huì)調(diào)用PHP解釋器本身來處理請求,PHP解釋器(在Windows下)就是php-cgi.exe.