網(wǎng)上對(duì)于FastCGI與mod_php的知識(shí)比較雜亂而不全面,故在此整理一下,以便入門學(xué)習(xí)者查閱方便烫扼。 背景PHP最常用的方式是以模塊的方式(mod_php)運(yùn)行在Apache中彤敛,也是Apache運(yùn)行PHP的默認(rèn)方式;但在Nginx中卖词,Nginx又使用的是PHP-FPM巩那,但是PHP-FPM到底是個(gè)什么東東?跟php有什么關(guān)系此蜈?今天我們一起來探究一番即横。
網(wǎng)上對(duì)于FastCGI與mod_php的知識(shí)比較雜亂而不全面,故在此整理一下裆赵,以便入門學(xué)習(xí)者查閱方便东囚。
PHP最常用的方式是以模塊的方式(mod_php)運(yùn)行在Apache中,也是Apache運(yùn)行PHP的默認(rèn)方式顾瞪;但在Nginx中舔庶,Nginx又使用的是PHP-FPM,但是PHP-FPM到底是個(gè)什么東東陈醒?跟php有什么關(guān)系惕橙?今天我們一起來探究一番。
首先需要記住的是钉跷,任何一種Web服務(wù)器(Apache弥鹦、Nginx等)都是被設(shè)計(jì)成向用戶發(fā)送html、圖片等靜態(tài)資源的爷辙,Web服務(wù)器自身并不能解釋任何動(dòng)態(tài)腳本(PHP彬坏、Python等)。
PHP處理器就是用來解釋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處理器來處理php代碼,那么怎么連接上服務(wù)器與php處理器呢离熏?也就是說服務(wù)器與php處理器如何通信佳谦?
答案是通過SAPI(Server Application Programming Interface 服務(wù)器端應(yīng)用編程端口),簡(jiǎn)單來說滋戳,SAPI指的是PHP具體應(yīng)用的編程接口钻蔑, 就像PC一樣啥刻,無論安裝哪些操作系統(tǒng),只要滿足了PC的接口規(guī)范都可以在PC上正常運(yùn)行矢棚, PHP腳本要執(zhí)行有很多種方式郑什,通過Web服務(wù)器,或者直接在命令行下蒲肋,也可以嵌入在其他程序中蘑拯,有興趣大家可以研究PHP內(nèi)核。
我們這里繼續(xù)討論P(yáng)HP最常用的SAPI提供的2種連接方法:mod_php和mod_fastcgi兜粘。
咱們回顧一下申窘,Apache是怎么能夠識(shí)別php代碼的?是不是Apache的配置文件httpd.conf中加上或者修改這樣幾句:
//添加
LoadModulephp5_module modules/libphp5.so
AddTypeapplication/x-httpd-php.php
//修改
DirectoryIndexindex.php index.html index.htm index.html
也即php作為Apache的一個(gè)子模塊來運(yùn)行孔轴,當(dāng)通過web訪問php文件時(shí)剃法,Apache就會(huì)調(diào)用php5_module來解析php代碼。
配置加載mod_php模塊后路鹰,php便是Apahce進(jìn)程本身一部分贷洲,每個(gè)新的Apache子進(jìn)程都會(huì)加載此模塊。
我們先看PHP-FPM官網(wǎng)的說明:
PHP-FPM - A simple and robust FastCGI Process Manager for PHP
PHP-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)單优构。這說明PHP-FPM是輔助mod_fastcgi模式進(jìn)行工作的,然而FastCGI又是個(gè)什么東西雁竞?管理著什么進(jìn)程钦椭?
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è)完整的新的交互式媒體快毛。
說白了盲厌,CGI是一種外部應(yīng)用程序(CGI程序)與Web服務(wù)器的協(xié)議,CGI是為了保證Server傳遞過來的數(shù)據(jù)是標(biāo)準(zhǔn)格式祸泪。
FastCGI像是一個(gè)常駐(long-live)型的CGI建芙,它可以一直執(zhí)行著没隘,只要激活后,不會(huì)每次都要花費(fèi)時(shí)間去fork一次(這是CGI最為人詬病的fork-and-execute 模式)禁荸。它還支持分布式的運(yùn)算, 即 FastCGI 程序可以在網(wǎng)站服務(wù)器以外的主機(jī)上執(zhí)行并且接受來自其它網(wǎng)站服務(wù)器來的請(qǐng)求右蒲。
FastCGI是語(yǔ)言無關(guān)的阀湿、可伸縮架構(gòu)的CGI開放擴(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)程(可見多個(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)程接著等待并處理來自FastCGI進(jìn)程管理器(運(yùn)行在Web Server中)的下一個(gè)連接,在CGI模式中尽棕,php-cgi在此便已經(jīng)退出喳挑。
也就是說FastCGI是CGI的升級(jí)版,一種語(yǔ)言無關(guān)的協(xié)議滔悉,用來溝通程序(如PHP, Python,Java)和Web服務(wù)器(Apache2, Nginx), 理論上任何語(yǔ)言編寫的程序都可以通過FastCGI來提供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就是針對(duì)于PHP的FastCGI的一種實(shí)現(xiàn)侄泽,他負(fù)責(zé)管理一個(gè)進(jìn)程池礁芦,來處理來自Web服務(wù)器的請(qǐng)求。
但是PHP-FPM僅僅是個(gè)“PHP FastCGI 進(jìn)程管理器”, 它仍會(huì)調(diào)用PHP解釋器本身來處理請(qǐng)求,PHP解釋器(在Windows下)就是php-cgi.exe柿扣。
更多PHP相關(guān)技術(shù)請(qǐng)搜索千鋒PHP肖方,做真實(shí)的自己,用良心做教育未状。
互聯(lián)網(wǎng)+時(shí)代俯画,時(shí)刻要保持學(xué)習(xí),攜手千鋒PHP,Dream
It Possible司草。