FastCGI與mod_php詳解

原文:PHP填坑記之FastCGI與mod_php詳解

網(wǎng)上對(duì)于FastCGI與mod_php的知識(shí)比較雜亂而不全面镇匀,故在此整理一下票彪,以便入門(mén)學(xué)習(xí)者查閱方便扫步。

背景
PHP最常用的方式是以模塊的方式(mod_php)運(yùn)行在Apache中蝙云,也是Apache運(yùn)行PHP的默認(rèn)方式捆等;但在Nginx中滞造,Nginx又使用的是PHP-FPM,但是PHP-FPM到底是個(gè)什么東東栋烤?跟php有什么關(guān)系谒养?今天我們一起來(lái)探究一番。

PHP處理器(PHP handlers)
首先需要記住的是明郭,任何一種Web服務(wù)器(Apache买窟、Nginx等)都是被設(shè)計(jì)成向用戶發(fā)送html丰泊、圖片等靜態(tài)資源的,Web服務(wù)器自身并不能解釋任何動(dòng)態(tài)腳本(PHP始绍、Python等)瞳购。
PHP處理器就是用來(lái)解釋W(xué)eb應(yīng)用中的PHP代碼,并將它解釋為HTML或其他靜態(tài)資源亏推,然后將解析的結(jié)果傳給Web服務(wù)器学赛,最后再由Web服務(wù)器發(fā)送給用戶。
大多數(shù)的Web服務(wù)器都不能解析PHP代碼吞杭,因此它需要一個(gè)能解析PHP代碼的程序盏浇,這就是PHP處理器。
現(xiàn)在我們知道了芽狗,Apache與Nginx都需要PHP處理器來(lái)處理php代碼绢掰,那么怎么連接上服務(wù)器與php處理器呢?也就是說(shuō)服務(wù)器與php處理器如何通信译蒂?
答案是通過(guò)SAPI(Server Application Programming Interface 服務(wù)器端應(yīng)用編程端口)曼月,簡(jiǎn)單來(lái)說(shuō),SAPI指的是PHP具體應(yīng)用的編程接口柔昼, 就像PC一樣哑芹,無(wú)論安裝哪些操作系統(tǒng),只要滿足了PC的接口規(guī)范都可以在PC上正常運(yùn)行捕透, PHP腳本要執(zhí)行有很多種方式聪姿,通過(guò)Web服務(wù)器,或者直接在命令行下乙嘀,也可以嵌入在其他程序中末购,有興趣大家可以研究PHP內(nèi)核。
我們這里繼續(xù)討論P(yáng)HP最常用的SAPI提供的2種連接方法:mod_php和mod_fastcgi虎谢。

mod_php模式
咱們回顧一下盟榴,Apache是怎么能夠識(shí)別php代碼的?是不是Apache的配置文件httpd.conf中加上或者修改這樣幾句:

//添加

LoadModule php5_module modules/libphp5.so

AddType application/x-httpd-php.php

//修改

<IfModule dir_module>

DirectoryIndex index.php index.html index.htm index.html

</IfModule>

也即php作為Apache的一個(gè)子模塊來(lái)運(yùn)行婴噩,當(dāng)通過(guò)web訪問(wèn)php文件時(shí)擎场,Apache就會(huì)調(diào)用php5_module來(lái)解析php代碼。
配置加載mod_php模塊后几莽,php便是Apahce進(jìn)程本身一部分迅办,每個(gè)新的Apache子進(jìn)程都會(huì)加載此模塊。

mod_fastcgi模式
我們先看PHP-FPM官網(wǎng)的說(shuō)明:
PHP-FPM - A simple and robust FastCGI Process Manager for PHPPHP-FPM (FastCGI Process Manager) is an alternative PHP FastCGI implementation with some additional features useful for sites of any size, especially busier sites.

PHP-FPM是一個(gè)PHP的FastCGI進(jìn)程管理器章蚣,解釋的非常簡(jiǎn)單站欺。這說(shuō)明PHP-FPM是輔助mod_fastcgi模式進(jìn)行工作的,然而FastCGI又是個(gè)什么東西?管理著什么進(jìn)程矾策?

什么是CGI磷账?
CGI(Common Gateway Interface) 是WWW技術(shù)中最重要的技術(shù)之一,有著不可替代的重要地位蝴韭。
CGI是外部應(yīng)用程序(CGI程序)與Web服務(wù)器之間的接口標(biāo)準(zhǔn)够颠,是在CGI程序和Web服務(wù)器之間傳遞信息的規(guī)程。
CGI規(guī)范允許Web服務(wù)器執(zhí)行外部程序榄鉴,并將它們的輸出發(fā)送給Web瀏覽器履磨,CGI將Web的一組簡(jiǎn)單的靜態(tài)超媒體文檔變成一個(gè)完整的新的交互式媒體。
說(shuō)白了庆尘,CGI是一種外部應(yīng)用程序(CGI程序)與Web服務(wù)器的協(xié)議剃诅,CGI是為了保證Server傳遞過(guò)來(lái)的數(shù)據(jù)是標(biāo)準(zhǔn)格式。

什么是FastCGI驶忌?
FastCGI像是一個(gè)常駐(long-live)型的CGI矛辕,它可以一直執(zhí)行著,只要激活后付魔,不會(huì)每次都要花費(fèi)時(shí)間去fork一次(這是CGI最 為人詬病的fork-and-execute 模式)聊品。它還支持分布式的運(yùn)算, 即 FastCGI 程序可以在網(wǎng)站服務(wù)器以外的主機(jī)上執(zhí)行并且接受來(lái)自其它網(wǎng)站服務(wù)器來(lái)的請(qǐng)求。

FastCGI是語(yǔ)言無(wú)關(guān)的几苍、可伸縮架構(gòu)的CGI開(kāi)放擴(kuò)展翻屈,其主要行為是將CGI解釋器進(jìn)程保持在內(nèi)存中并因此獲得較高的性能。眾所周知妻坝,CGI解 釋器的反復(fù)加載是CGI性能低下的主要原因伸眶,如果CGI解釋器保持在內(nèi)存中并接受FastCGI進(jìn)程管理器調(diào)度,則可以提供良好的性能刽宪、伸縮性厘贼、 Fail- Over特性等等。

一般情況下圣拄,F(xiàn)astCGI的整個(gè)工作流程是這樣的:

  • Web Server啟動(dòng)時(shí)載入FastCGI進(jìn)程管理器(IIS ISAPI或Apache Module)嘴秸。
  • FastCGI進(jìn)程管理器自身初始化,啟動(dòng)多個(gè)CGI解釋器進(jìn)程(可見(jiàn)多個(gè)php-cgi)并等待WebServer的連接庇谆。
  • 當(dāng)客戶端請(qǐng)求到達(dá)Web Server時(shí)赁遗,F(xiàn)astCGI進(jìn)程管理器選擇并連接到一個(gè)CGI解釋器。 Web server將CGI環(huán)境變量和標(biāo)準(zhǔn)輸入發(fā)送到FastCGI子進(jìn)程php-cgi族铆。
  • FastCGI子進(jìn)程完成處理后將標(biāo)準(zhǔn)輸出和錯(cuò)誤信息從同一連接返回Web Server。當(dāng)FastCGI子進(jìn)程關(guān)閉連接時(shí)哭尝,請(qǐng)求便告處理完成哥攘,F(xiàn)astCGI子進(jìn)程接著等待并處理來(lái)自FastCGI進(jìn)程管理器(運(yùn)行在Web Server中)的下一個(gè)連接,在CGI模式中,php-cgi在此便已經(jīng)退出逝淹。

也就是說(shuō)FastCGI是CGI的升級(jí)版耕姊,一種語(yǔ)言無(wú)關(guān)的協(xié)議,用來(lái)溝通程序(如PHP, Python, Java)和Web服務(wù)器(Apache2, Nginx), 理論上任何語(yǔ)言編寫(xiě)的程序都可以通過(guò)FastCGI來(lái)提供Web服務(wù)栅葡。
FastCGI的特點(diǎn)是會(huì)在一個(gè)進(jìn)程中依次完成多個(gè)請(qǐng)求茉兰,以達(dá)到提高效率的目的,大多數(shù)FastCGI實(shí)現(xiàn)都會(huì)維護(hù)一個(gè)進(jìn)程池欣簇。
通俗解釋:FastCGI事先就需要啟動(dòng)规脸,而且可以啟動(dòng)多個(gè)CGI模塊,在那里一直運(yùn)行等著web發(fā)請(qǐng)求熊咽,然后再給php解析運(yùn)算莫鸭,完成后生成html返回給web后,但是完成后它不會(huì)退出横殴,而是繼續(xù)等著下一個(gè)web請(qǐng)求被因。

PHP-FPM
PHP-FPM就是針對(duì)于PHP的FastCGI的一種實(shí)現(xiàn),他負(fù)責(zé)管理一個(gè)進(jìn)程池衫仑,來(lái)處理來(lái)自Web服務(wù)器的請(qǐng)求梨与。
但是PHP-FPM僅僅是個(gè)“PHP FastCGI 進(jìn)程管理器”, 它仍會(huì)調(diào)用PHP解釋器本身來(lái)處理請(qǐng)求,PHP解釋器(在Windows下)就是php-cgi.exe文狱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末粥鞋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子如贷,更是在濱河造成了極大的恐慌陷虎,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杠袱,死亡現(xiàn)場(chǎng)離奇詭異尚猿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)楣富,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)凿掂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人纹蝴,你說(shuō)我怎么就攤上這事庄萎。” “怎么了塘安?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵糠涛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我兼犯,道長(zhǎng)忍捡,這世上最難降的妖魔是什么集漾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮砸脊,結(jié)果婚禮上具篇,老公的妹妹穿的比我還像新娘。我一直安慰自己凌埂,他們只是感情好驱显,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著瞳抓,像睡著了一般埃疫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挨下,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天熔恢,我揣著相機(jī)與錄音,去河邊找鬼臭笆。 笑死叙淌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的愁铺。 我是一名探鬼主播鹰霍,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼茵乱!你這毒婦竟也來(lái)了茂洒?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瓶竭,失蹤者是張志新(化名)和其女友劉穎督勺,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體斤贰,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡智哀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荧恍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓷叫。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖送巡,靈堂內(nèi)的尸體忽然破棺而出摹菠,到底是詐尸還是另有隱情,我是刑警寧澤骗爆,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布次氨,位于F島的核電站,受9級(jí)特大地震影響摘投,放射性物質(zhì)發(fā)生泄漏煮寡。R本人自食惡果不足惜屉佳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望洲押。 院中可真熱鬧,春花似錦圆凰、人聲如沸杈帐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)挑童。三九已至,卻和暖如春跃须,著一層夾襖步出監(jiān)牢的瞬間站叼,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工菇民, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尽楔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓第练,卻偏偏與公主長(zhǎng)得像阔馋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子娇掏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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

  • 0 系列目錄# WEB請(qǐng)求處理 WEB請(qǐng)求處理一:瀏覽器請(qǐng)求發(fā)起處理 WEB請(qǐng)求處理二:Nginx請(qǐng)求反向代理 本...
    七寸知架構(gòu)閱讀 13,887評(píng)論 22 190
  • 網(wǎng)上對(duì)于FastCGI與mod_php的知識(shí)比較雜亂而不全面呕寝,故在此整理一下,以便入門(mén)學(xué)習(xí)者查閱方便婴梧。 背景PHP...
    斯文小螞蟻閱讀 247評(píng)論 1 4
  • 網(wǎng)上對(duì)于FastCGI與mod_php的知識(shí)比較雜亂而不全面下梢,故在此整理一下,以便入門(mén)學(xué)習(xí)者查閱方便塞蹭。 背景PHP...
    php紅薯閱讀 1,582評(píng)論 3 32
  • 1. Nginx的模塊與工作原理 Nginx由內(nèi)核和模塊組成孽江,其中,內(nèi)核的設(shè)計(jì)非常微小和簡(jiǎn)潔浮还,完成的工作也非常簡(jiǎn)單...
    rosekissyou閱讀 10,197評(píng)論 5 124
  • 背景 PHP最常用的方式是以模塊的方式(mod_php)運(yùn)行在Apache中竟坛,也是Apache運(yùn)行PHP的默認(rèn)方式...
    柏樹(shù)_Jeff閱讀 978評(píng)論 1 11