今天學(xué)習(xí)了php-fpm相關(guān)內(nèi)容浑侥,看了一篇博客姊舵,寫(xiě)得很好,結(jié)合博客內(nèi)容和自己的理解畫(huà)出了以下簡(jiǎn)單的流程圖寓落,以供其他同學(xué)學(xué)習(xí)哈括丁。
首先,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)程管理(皇上恍箭,臣妾真的做不到翱坦А!)所以就出現(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)越流行。
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出
不對(duì)仇哆。php-cgi只是解釋PHP腳本的程序而已。
博客來(lái)源:https://blog.csdn.net/u010785091/article/details/78705690
感謝作者: MHSLZ1