淺談PHP fastcgi和php-fpm

neuyu發表於2021-09-09

講到PHP開發,就一定會提到fastcgi和php-fpm,這兩個東西對PHP的效能有著至關重要的作用。在百度實習的這段時間裡,用到的ODP環境就是用的php-fpm,但一直以來對它一無所知,甚至對整個PHP都概念模糊,這兩天任務提前完成,藉此機會對PHP做一點深入的瞭解。

Web伺服器

PHP作為一種專門為Web開發而生的服務端語言,其實現必須藉助Web伺服器,常見的PHP架構有LAMP和LNMP,找張圖片解釋了PHP的訪問情況。


圖片描述

Apache處理PHP請求

mod_php模式

可以看出請求是傳送到Apache,之後由Apache來解析處理PHP並返回結果給客戶端。當我們使用LAMP架構時,需要改動Apache的配置檔案httpd.conf

加入如下兩句
LoadModule phpx_module PHP_ROOT/phpxapache2_2.dllAddType appliaction/x-httpd-php.php
將下面語句做如下修改 DirectoryIndex index.html改為  DirectoryIndex index.html index.htm index.php index.phtml

使用LoadModule來載入phpx_module(x為PHP版本號)。可以理解為將PHP作為Apache的一個子模組來執行,當請求訪問PHP時,Apache就會呼叫phpx_module來解析PHP程式碼。
php_module是如何解析PHP程式碼的呢?——透過sapi。
Apache和PHP與sapi的關係如下圖:


圖片描述

Apache和PHP與sapi的關係


sapi就是一箇中間層,提供和外部通訊的介面,類似於socket,使得PHP可以和其他應用進行資料互動。PHP提供了多種sapi,如給Apache和Nginx的php_module,給IIS的ISAPI等。
Apache呼叫PHP的執行過程:

Apache -> httpd -> php_module -> sapi -> PHP

總之,Web伺服器透過php_module方式解析執行PHP的模式即為mod_php。

mod_fastcgi模式

PHP的sapi的另一種方式就是提供cgi模式,現在cgi已經被fastcgi取代。
所謂cgi,就是common gateway interface,當Web伺服器收到請求,就會把請求交給cgi程式(如PHP的fastcgi),cgi就將請求做處理(解析PHP),然後將結果返回給Web伺服器,Web伺服器再將請求返回給客戶端。
cgi的不足之處就是每次請求都會有啟動和退出的過程,也就是飽受詬病的fork-and-execute模式,在大量併發的請況下就完蛋了。
fastcgi的誕生彌補這一不足,它的原理是早早啟動好等待請求,在響應完請求後不會退出,繼續等待下一個請求。
利用fastcgi的執行方式稱為mod_fastcgi。
對比一下mod_php和mod_fastcgi的不同。前者是將PHP作為Web伺服器的一個模組來執行,PHP與伺服器結合度大。後者是將fastcgi作為中間過程,PHP和Web伺服器只透過fastcgi來完成請求與響應。


圖片描述

mod_php模式


mod_php模式下,Apache每接受一個請求,就會產生一個程式來連線PHP透過sapi完成請求,在高併發的情況下,顯然伺服器會無法承受。


圖片描述

mod-fastcgi模式


這張圖可以看出,每當有請求到達時,httpd會呼叫sapi將請求傳遞給PHP,完成後不退出,等待下一請求。併發效能大大提高。

php-fpm

磨刀不誤砍柴工,前面的講解只為引出php-fpm。php-fpm是做什麼的呢?其實就是用來輔助fastcgi的。
fastcgi是一種與平臺無關,與語言無關的介面實現,只需要不同語言按照規定方式實現即可完成與Web伺服器的通訊。上圖所示的php-cgi就是PHP自帶的fastcgi管理器。
網上看到的php-cgi的問題主要有兩點:

1.php-cgi變更php.ini陪之後需要重啟php-cgi才能使新的php.ini生效,不能平滑重啟。
2.若直接殺死php-cgi,PHP便無法執行

php-fpm完美解決了上述不足,是一款專用的fastcgi管理器。
總之,php-fpm的作用就是專門管理PHP中的fastcgi,使PHP在高併發的情況下也能安全穩定的與Web伺服器合作,完成請求響應過程。



作者:Chuck_Hu
連結:
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4550/viewspace-2802681/,如需轉載,請註明出處,否則將追究法律責任。

相關文章