轉(zhuǎn)載https://segmentfault.com/q/1010000000256516
- 首先骇窍,CGI是干嘛的溢豆?CGI是為了保證web server傳遞過(guò)來(lái)的數(shù)據(jù)是標(biāo)準(zhǔn)格式的饼拍,方便CGI程序的編寫(xiě)者承匣。
- web server(比如說(shuō)nginx)只是內(nèi)容的分發(fā)者贯城。比如,如果請(qǐng)求/index.html斗忌,那么web server會(huì)去文件系統(tǒng)中找到這個(gè)文件,發(fā)送給瀏覽器旺聚,這里分發(fā)的是靜態(tài)數(shù)據(jù)织阳。好了,如果現(xiàn)在請(qǐng)求的是/index.php砰粹,根據(jù)配置文件唧躲,nginx知道這個(gè)不是靜態(tài)文件,需要去找PHP解析器來(lái)處理,那么他會(huì)把這個(gè)請(qǐng)求簡(jiǎn)單處理后交給PHP解析器惊窖。Nginx會(huì)傳哪些數(shù)據(jù)給PHP解析器呢刽宪?url要有吧,查詢字符串也得有吧界酒,POST數(shù)據(jù)也要有圣拄,HTTP header不能少吧,好的毁欣,CGI就是規(guī)定要傳哪些數(shù)據(jù)庇谆、以什么樣的格式傳遞給后方處理這個(gè)請(qǐng)求的協(xié)議。仔細(xì)想想凭疮,你在PHP代碼中使用的用戶從哪里來(lái)的饭耳。
- 當(dāng)web server收到/index.php這個(gè)請(qǐng)求后,會(huì)啟動(dòng)對(duì)應(yīng)的CGI程序执解,這里就是PHP的解析器寞肖。接下來(lái)PHP解析器會(huì)解析php.ini文件,初始化執(zhí)行環(huán)境衰腌,然后處理請(qǐng)求新蟆,再以規(guī)定CGI規(guī)定的格式返回處理后的結(jié)果,退出進(jìn)程右蕊。web server再把結(jié)果返回給瀏覽器琼稻。
- 好了,CGI是個(gè)協(xié)議饶囚,跟進(jìn)程什么的沒(méi)關(guān)系帕翻。那fastcgi又是什么呢?Fastcgi是用來(lái)提高CGI程序性能的萝风。
提高性能嘀掸,那么CGI程序的性能問(wèn)題在哪呢?"PHP解析器會(huì)解析php.ini文件规惰,初始化執(zhí)行環(huán)境"横殴,就是這里了。標(biāo)準(zhǔn)的CGI對(duì)每個(gè)請(qǐng)求都會(huì)執(zhí)行這些步驟(不閑累扒渌衫仑!啟動(dòng)進(jìn)程很累的說(shuō)!)堕花,所以處理每個(gè)時(shí)間的時(shí)間會(huì)比較長(zhǎng)文狱。這明顯不合理嘛!那么Fastcgi是怎么做的呢缘挽?首先瞄崇,F(xiàn)astcgi會(huì)先啟一個(gè)master呻粹,解析配置文件,初始化執(zhí)行環(huán)境苏研,然后再啟動(dòng)多個(gè)worker等浊。當(dāng)請(qǐng)求過(guò)來(lái)時(shí),master會(huì)傳遞給一個(gè)worker摹蘑,然后立即可以接受下一個(gè)請(qǐng)求筹燕。這樣就避免了重復(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程序,他自己本身只能解析請(qǐng)求驱显,返回結(jié)果诗芜,不會(huì)進(jìn)程管理(皇上,臣妾真的做不到鞍R摺7帧)所以就出現(xiàn)了一些能夠調(diào)度php-cgi進(jìn)程的程序,比如說(shuō)由lighthttpd分離出來(lái)的spawn-fcgi栓霜。好了PHP-FPM也是這么個(gè)東東翠桦,在長(zhǎng)時(shí)間的發(fā)展后,逐漸得到了大家的認(rèn)可(要知道胳蛮,前幾年大家可是抱怨PHP-FPM穩(wěn)定性太差的)销凑,也越來(lái)越流行。
- 好了仅炊,最后來(lái)回來(lái)你的問(wèn)題斗幼。 網(wǎng)上有的說(shuō),fastcgi是一個(gè)協(xié)議抚垄,php-fpm實(shí)現(xiàn)了這個(gè)協(xié)議
對(duì)蜕窿。
- 有的說(shuō)谋逻,php-fpm是fastcgi進(jìn)程的管理器,用來(lái)管理fastcgi進(jìn)程的
對(duì)桐经。php-fpm的管理對(duì)象是php-cgi毁兆。但不能說(shuō)php-fpm是fastcgi進(jìn)程的管理器,因?yàn)榍懊嬲f(shuō)了fastcgi是個(gè)協(xié)議阴挣,似乎沒(méi)有這么個(gè)進(jìn)程存在气堕,就算存在php-fpm也管理不了他(至少目前是)。
- 有的說(shuō)屯吊,php-fpm是php內(nèi)核的一個(gè)補(bǔ)丁
以前是對(duì)的送巡。因?yàn)樽铋_(kāi)始的時(shí)候php-fpm沒(méi)有包含在PHP內(nèi)核里面,要使用這個(gè)功能盒卸,需要找到與源碼版本相同的php-fpm對(duì)內(nèi)核打補(bǔ)丁骗爆,然后再編譯。后來(lái)PHP內(nèi)核集成了PHP-FPM之后就方便多了蔽介,使用--enalbe-fpm這個(gè)編譯參數(shù)即可摘投。
- 有的說(shuō),修改了php.ini配置文件后虹蓄,沒(méi)辦法平滑重啟犀呼,所以就誕生了php-fpm
是的,修改php.ini之后薇组,php-cgi進(jìn)程的確是沒(méi)辦法平滑重啟的外臂。php-fpm對(duì)此的處理機(jī)制是新的worker用新的配置,已經(jīng)存在的worker處理完手上的活就可以歇著了律胀,通過(guò)這種機(jī)制來(lái)平滑過(guò)度宋光。
- 還有的說(shuō)PHP-CGI是PHP自帶的FastCGI管理器,那這樣的話干嗎又弄個(gè)php-fpm出來(lái)
不對(duì)炭菌。php-cgi只是解釋PHP腳本的程序而已罪佳。