淺析PHP-FPM咳蔚、CGI、Fast CGI的關(guān)系

作為一個(gè)phper,一直會(huì)接觸到php搔驼、nignx等的相關(guān)配置谈火,相關(guān)的名詞比如PHP-FPM、CGI舌涨、Fast CGI糯耍、SAPI等等應(yīng)該都或多或少接觸過,但自己對(duì)于這些知識(shí)點(diǎn)的掌握其實(shí)相對(duì)比較分散且形成不了一定的關(guān)系囊嘉,于是在網(wǎng)上搜了相關(guān)的文章并結(jié)合自己的一些理解温技,整理成此文,便于記錄扭粱。

首先荒揣,先看一個(gè)最簡(jiǎn)單的服務(wù)器請(qǐng)求和響應(yīng)的流程

image.png

在這個(gè)例子中,Web Server(如Nginx)只是內(nèi)容的分發(fā)者焊刹,如果客戶端請(qǐng)求的是 index.html等靜態(tài)文件系任,那么Web Server會(huì)去文件系統(tǒng)中找到這個(gè)文件,發(fā)送給瀏覽器虐块,這里分發(fā)的是靜態(tài)數(shù)據(jù)俩滥。

如果請(qǐng)求的是php文件,nginx無法直接處理贺奠,就會(huì)去配置文件nginx中尋找是否有對(duì)于php文件的配置

server
    {
        listen 80 default_server;
        server_name _;
        index index.html index.htm index.php;
        root  /home/wwwroot/test/public;
        #error_page   404   /404.html;

        location ~ [^/]\.php(/|$)
        {
            try_files $uri =404;
            fastcgi_pass  unix:/tmp/php-cgi.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
...

在nginx.conf文件中霜旧,大家可以發(fā)現(xiàn)有這么一段配置,如果是php文件的請(qǐng)求儡率,就會(huì)分發(fā)到這個(gè)邏輯中挂据。

這里定義的是與php解析器進(jìn)行通訊的一些配置參數(shù)以清,其中fastcgi_pass參數(shù)約定了nginx和php進(jìn)行通訊的socket是unix:/tmp/php-cgi.sock,后文會(huì)講到php同時(shí)也會(huì)對(duì)應(yīng)的監(jiān)聽這個(gè)端口

PS:部分配置文件中這個(gè)地址會(huì)是一個(gè)IP+端口號(hào)的TCP形式崎逃,TCP可以跨服務(wù)器掷倔,而UNIX Domain Socket不經(jīng)過網(wǎng)絡(luò)層,只能用于Nginx跟PHP-FPM都在同一服務(wù)器的場(chǎng)景

這樣子友誼的小橋就這樣順利的搭建起來了。現(xiàn)在小橋搭建好了个绍,剩下的就是通訊的數(shù)據(jù)格式的統(tǒng)一了勒葱,這時(shí)候需要用到Fast-cgi協(xié)議,這個(gè)協(xié)議約定了這兩者通訊的數(shù)據(jù)格式

CGI:是 Web Server 與 Web Application 之間數(shù)據(jù)交換的一種協(xié)議,因?yàn)槠涿看握?qǐng)求都要執(zhí)行fork-and-execut的流程巴柿,所以存在較大的性能瓶頸凛虽,現(xiàn)在已經(jīng)很少使用

FastCGI:同 CGI,是一種通信協(xié)議广恢,但比 CGI 在效率上做了一些優(yōu)化凯旋,采用了常駐(long-live)型來減少系統(tǒng)的開銷,使得性能大大提升

前面說過Fast CGI只是一種協(xié)議(看到有不少文章會(huì)將這是一個(gè)應(yīng)用程序钉迷,其實(shí)是不對(duì)的)瓦阐,那遵循這個(gè)協(xié)議的實(shí)現(xiàn)者就是我們熟悉的PHP-FPM(FastCGI Process Manager),它的架構(gòu)是由一個(gè)manager進(jìn)程負(fù)責(zé)管理一個(gè)進(jìn)程池篷牌,進(jìn)程池中就是子進(jìn)程php-cgi

打開php安裝目錄下的php-fpm.conf,可以看到有以下一段參數(shù)配置

listen = /tmp/php-cgi.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www

可以看到php-fpm下同樣監(jiān)聽了/tmp/php-cgi.sock這個(gè)socket踏幻,這和前面nginx.conf的配置是對(duì)應(yīng)的

于是請(qǐng)求最后就交由到FastCGI子進(jìn)程來進(jìn)行處理枷颊,F(xiàn)astCGI子進(jìn)程完成處理后,將標(biāo)準(zhǔn)輸出和錯(cuò)誤信息從同一連接返回Web Server進(jìn)行輸出

所以一個(gè)php請(qǐng)求的自上而下的流程如下圖:

image.png

這里有一個(gè)名詞放在文末將可能會(huì)更加的便于理解该面,大家可以看到我在圖中將CGI包含在一個(gè)叫SAPI的類型下夭苗,那什么是SAPI呢?下面的解釋引用至鳥哥的博客

SAPI: Server abstraction API隔缀,研究過PHP架構(gòu)的同學(xué)應(yīng)該知道這個(gè)東東的重要性题造,它提供了一個(gè)接口,使得PHP可以和其他應(yīng)用進(jìn)行交互數(shù)據(jù)

前面我們講過的Fast CGI猾瘸,還有其他比如shell的CLI界赔,以及apache的mod_php5,都屬于SAPI的范疇牵触,目的是為了讓各個(gè)服務(wù)器抽象層之間遵守著相同的約定淮悼,使php本身和上層應(yīng)用解耦隔離,使php的可移植性更強(qiáng)揽思。

原文鏈接:https://segmentfault.com/a/1190000021201781

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末袜腥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钉汗,更是在濱河造成了極大的恐慌羹令,老刑警劉巖鲤屡,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異福侈,居然都是意外死亡酒来,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門癌刽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來役首,“玉大人,你說我怎么就攤上這事显拜『獍拢” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵远荠,是天一觀的道長(zhǎng)矮固。 經(jīng)常有香客問我,道長(zhǎng)譬淳,這世上最難降的妖魔是什么档址? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮邻梆,結(jié)果婚禮上守伸,老公的妹妹穿的比我還像新娘。我一直安慰自己浦妄,他們只是感情好尼摹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剂娄,像睡著了一般蠢涝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阅懦,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天和二,我揣著相機(jī)與錄音,去河邊找鬼耳胎。 笑死惯吕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的怕午。 我是一名探鬼主播混埠,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼诗轻!你這毒婦竟也來了钳宪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吏颖,沒想到半個(gè)月后搔体,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡半醉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年疚俱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缩多。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呆奕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衬吆,到底是詐尸還是另有隱情梁钾,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布逊抡,位于F島的核電站姆泻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏冒嫡。R本人自食惡果不足惜拇勃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望孝凌。 院中可真熱鬧方咆,春花似錦、人聲如沸蟀架。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辜窑。三九已至,卻和暖如春寨躁,著一層夾襖步出監(jiān)牢的瞬間穆碎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工职恳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留所禀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓放钦,卻偏偏與公主長(zhǎng)得像色徘,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子操禀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容