本篇文章給大家簡(jiǎn)單介紹一下PHP中的fastcgi和php-fpm。有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)大家有所幫助。

講到PHP開發(fā),就一定會(huì)提到fastcgi和php-fpm,這兩個(gè)東西對(duì)PHP的性能有著至關(guān)重要的作用。在百度實(shí)習(xí)的這段時(shí)間里,用到的ODP環(huán)境就是用的php-fpm,但一直以來對(duì)它一無所知,甚至對(duì)整個(gè)PHP都概念模糊,這兩天任務(wù)提前完成,借此機(jī)會(huì)對(duì)PHP做一點(diǎn)深入的了解。
Web服務(wù)器
PHP作為一種專門為Web開發(fā)而生的服務(wù)端語言,其實(shí)現(xiàn)必須借助Web服務(wù)器,常見的PHP架構(gòu)有LAMP和LNMP,找張圖片解釋了PHP的訪問情況。

Apache處理PHP請(qǐng)求
mod_php模式
可以看出請(qǐng)求是發(fā)送到Apache,之后由Apache來解析處理PHP并返回結(jié)果給客戶端。當(dāng)我們使用LAMP架構(gòu)時(shí),需要改動(dòng)Apache的配置文件httpd.conf
加入如下兩句 LoadModule phpx_module PHP_ROOT/phpxapache2_2.dllAddType appliaction/x-httpd-php.php 將下面語句做如下修改<IfModule dir_module> DirectoryIndex index.html</IfModule>改為 <IfModule dir_module> DirectoryIndex index.html index.htm index.php index.phtml</IfModule>
使用LoadModule來加載phpx_module(x為PHP版本號(hào))。可以理解為將PHP作為Apache的一個(gè)子模塊來運(yùn)行,當(dāng)請(qǐng)求訪問PHP時(shí),Apache就會(huì)調(diào)用phpx_module來解析PHP代碼。
php_module是如何解析PHP代碼的呢?——通過sapi。
Apache和PHP與sapi的關(guān)系如下圖:

sapi就是一個(gè)中間層,提供和外部通信的接口,類似于socket,使得PHP可以和其他應(yīng)用進(jìn)行數(shù)據(jù)交互。PHP提供了多種sapi,如給Apache和Nginx的php_module,給IIS的ISAPI等。
Apache調(diào)用PHP的執(zhí)行過程:
Apache -> httpd -> php_module -> sapi -> PHP
總之,Web服務(wù)器通過php_module方式解析執(zhí)行PHP的模式即為mod_php。
mod_fastcgi模式
PHP的sapi的另一種方式就是提供cgi模式,現(xiàn)在cgi已經(jīng)被fastcgi取代。
所謂cgi,就是common gateway interface,當(dāng)Web服務(wù)器收到請(qǐng)求,就會(huì)把請(qǐng)求交給cgi程序(如PHP的fastcgi),cgi就將請(qǐng)求做處理(解析PHP),然后將結(jié)果返回給Web服務(wù)器,Web服務(wù)器再將請(qǐng)求返回給客戶端。
cgi的不足之處就是每次請(qǐng)求都會(huì)有啟動(dòng)和退出的過程,也就是飽受詬病的fork-and-execute模式,在大量并發(fā)的請(qǐng)況下就完蛋了。
fastcgi的誕生彌補(bǔ)這一不足,它的原理是早早啟動(dòng)好等待請(qǐng)求,在響應(yīng)完請(qǐng)求后不會(huì)退出,繼續(xù)等待下一個(gè)請(qǐng)求。
利用fastcgi的運(yùn)行方式稱為mod_fastcgi。
對(duì)比一下mod_php和mod_fastcgi的不同。前者是將PHP作為Web服務(wù)器的一個(gè)模塊來運(yùn)行,PHP與服務(wù)器結(jié)合度大。后者是將fastcgi作為中間過程,PHP和Web服務(wù)器只通過fastcgi來完成請(qǐng)求與響應(yīng)。

mod_php模式
mod_php模式下,Apache每接受一個(gè)請(qǐng)求,就會(huì)產(chǎn)生一個(gè)進(jìn)程來連接PHP通過sapi完成請(qǐng)求,在高并發(fā)的情況下,顯然服務(wù)器會(huì)無法承受。

mod-fastcgi模式
這張圖可以看出,每當(dāng)有請(qǐng)求到達(dá)時(shí),httpd會(huì)調(diào)用sapi將請(qǐng)求傳遞給PHP,完成后不退出,等待下一請(qǐng)求。并發(fā)性能大大提高。
php-fpm
磨刀不誤砍柴工,前面的講解只為引出php-fpm。php-fpm是做什么的呢?其實(shí)就是用來輔助fastcgi的。
fastcgi是一種與平臺(tái)無關(guān),與語言無關(guān)的接口實(shí)現(xiàn),只需要不同語言按照規(guī)定方式實(shí)現(xiàn)即可完成與Web服務(wù)器的通信。上圖所示的php-cgi就是PHP自帶的fastcgi管理器。
網(wǎng)上看到的php-cgi的問題主要有兩點(diǎn):
-
php-cgi變更php.ini陪之后需要重啟php-cgi才能使新的php.ini生效,不能平滑重啟。
-
若直接殺死php-cgi,PHP便無法運(yùn)
php-fpm完美解決了上述不足,是一款專用的fastcgi管理器。
總之,php-fpm的作用就是專門管理PHP中的fastcgi,使PHP在高并發(fā)的情況下也能安全穩(wěn)定的與Web服務(wù)器合作,完成請(qǐng)求響應(yīng)過程。
推薦學(xué)習(xí):php視頻教程
站長資訊網(wǎng)