當(dāng)一個(gè)url請(qǐng)求發(fā)送的web server后坛增,是如何解析并返回結(jié)果的呢获雕?
先介紹下今天的幾個(gè)主角:
Nginx,cgi收捣,php-cgi届案,F(xiàn)astCgi,php-fpm
正式因?yàn)檫@幾個(gè)主角的存在罢艾,當(dāng)一個(gè)url請(qǐng)求發(fā)送到服務(wù)器后楣颠,才能完成調(diào)度,解析咐蚯,并返回結(jié)果童漩。
當(dāng)一個(gè)請(qǐng)求,比如 /index.html 發(fā)送到web server(apache or Nginx)春锋,web server配置文件檢測(cè)到這是一個(gè)簡(jiǎn)單的請(qǐng)求靜態(tài)文件矫膨,于是便可以在文件系統(tǒng)中尋找的該文件直接返回。但是如果是一個(gè) /index.php 請(qǐng)求期奔,web server發(fā)現(xiàn)其不是一個(gè)靜態(tài)文件侧馅,便無(wú)法再解析,于是呐萌,它便起到了一個(gè)傳遞者的作用馁痴,把這個(gè)請(qǐng)求傳遞給能解析它的人手里,然后接受解析結(jié)果搁胆,并返回給web.
web server :一個(gè)內(nèi)容的傳遞者
當(dāng)一個(gè)動(dòng)態(tài)請(qǐng)求弥搞,比如 /index.php 發(fā)送到 web server(Nginx)后邮绿,Nginx無(wú)法解析,便會(huì)啟動(dòng)對(duì)應(yīng)的Cgi程序攀例,這里就是PHP解析器船逮,PHP解析器會(huì)解析php.ini文件,然后初始化php執(zhí)行環(huán)境粤铭,解析請(qǐng)求挖胃,并返回結(jié)果。
Cgi:只是個(gè)協(xié)議梆惯,web server根據(jù)這個(gè)協(xié)議知道要啟動(dòng)那個(gè)程序
這一切看起來(lái)很流暢酱鸭,但是仔細(xì)讀上面的流程會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題“接收到一個(gè)請(qǐng)求,PHP會(huì)解析php.ini文件垛吗,初始化執(zhí)行環(huán)境”凹髓,這tm會(huì)非常耗時(shí)啊,初始化環(huán)境操作啊怯屉,這個(gè)在高并發(fā)下是絕對(duì)不能忍受的蔚舀,于是便出現(xiàn)了Fast-Cgi,所以Fast-Cgi也是協(xié)議锨络,它只是Cgi的升級(jí)版赌躺。
Fast-Cgi:Cgi協(xié)議的升級(jí)版,優(yōu)化了該協(xié)議羡儿,提高了性能
Fast-Cgi是如何提高性能的礼患?首先它會(huì)啟動(dòng)一個(gè)master,來(lái)解析php.ini文件掠归,初始化php執(zhí)行環(huán)境缅叠。然后會(huì)根據(jù)配置文件啟動(dòng)一些woker進(jìn)程。當(dāng)master接收到一個(gè)請(qǐng)求后拂到,會(huì)立即轉(zhuǎn)給一個(gè)worker痪署,然后又繼續(xù)準(zhǔn)備接受請(qǐng)求。worker接收到請(qǐng)求后兄旬,會(huì)解析狼犯,并按照f(shuō)ast-cgi協(xié)議約定的格式返回給web。這就大大的提高了性能领铐。
而php-fpm就是完成了上述功能悯森,及實(shí)現(xiàn)了Fast-Cgi協(xié)議的東西。
php-fpm:實(shí)現(xiàn)了Fast-Cgi協(xié)議绪撵,完成了對(duì)php解析器的進(jìn)程管理
php-cgi:只是個(gè)cgi程序瓢姻,只能解析請(qǐng)求,并返回結(jié)果音诈,不負(fù)責(zé)進(jìn)程方面的事情
小結(jié)
當(dāng)一個(gè)請(qǐng)求發(fā)送到web server(apache/nginx)后幻碱,如果是靜態(tài)文件绎狭,則直接返回文件系統(tǒng)中的該文件,如果是非靜態(tài)文件褥傍,nginx則無(wú)法處理儡嘶, 便會(huì)啟動(dòng)對(duì)應(yīng)的cgi程序,及php-cgi恍风,php-cgi是個(gè)老人了蹦狂,每次解析配置文件,初始化環(huán)境很慢朋贬,因此引入了fast-cgi凯楔,fast-cgi只是個(gè)協(xié)議,它不是進(jìn)程锦募,也不受任何人管理摆屯,它做的事情就是有一個(gè)master和一定數(shù)量的worker,接收每個(gè)請(qǐng)求糠亩,并且在高并發(fā)的情況下鸥拧,能很好的處理,看起來(lái)像個(gè)年輕人一樣高效削解,輕便。但是由誰(shuí)來(lái)實(shí)現(xiàn)這個(gè)高效沟娱,年輕的協(xié)議氛驮,管理眾多php-cgi進(jìn)程呢?這就是php-fpm济似,原本php-fpm是php的插件矫废,但是因?yàn)樗絹?lái)越優(yōu)秀,已經(jīng)被php官方收錄砰蠢,成為了php的一員蓖扑。
ok,這就是完整的過(guò)程了台舱。
一個(gè)有意思的故事
你是php律杠,想和法國(guó)人(nginx)做生意。
你說(shuō)php語(yǔ)言竞惋,法國(guó)人說(shuō)C語(yǔ)言柜去,你們之間無(wú)法共同怎么辦?
需要把你們的語(yǔ)言按照標(biāo)準(zhǔn)的通用的協(xié)議轉(zhuǎn)換成一種通用的語(yǔ)言英語(yǔ)(fast-cgi)拆宛。
那么誰(shuí)來(lái)轉(zhuǎn)換呢嗓奢?
你需要使用翻譯機(jī)(php-fpm)。
nginx有它自己的翻譯機(jī)浑厚。
然后你們就可以做生意啦.....