淺談PHP fastcgi和php-fpm
講到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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- php-cli和php-fpm FastCgi與PHP-fpm之間的關係PHPAST
- 淺談PHP-FPM引數PHP
- CGI、FastCGI、PHP-CGI和PHP-FPM 概念區分ASTPHP
- CGI,FastCGI,PHP-FPM,PHP-CLI,modPHPASTPHP
- Nginx、fastCGI、php-fpm關係梳理NginxASTPHP
- 白話 CGI,FastCGI,PHP-CGI,PHP-fpmASTPHP
- 離開 CGI,FastCGI,PHP-FPM 談高可用挺空中樓閣的!ASTPHP
- 什麼是CGI、FastCGI、PHP-CGI、PHP-FPMASTPHP
- 區分wsgi、uWSGI、uwsgi、php-fpm、CGI、FastCGIPHPAST
- PHP知識筆記:CGI,FastCGI,PHP-CGI,PHP-FPM,Spawn-FCGI區別PHP筆記AST
- PHP-FPM和nginx配置PHPNginx
- fast-CGI 和 PHP-fpmASTPHP
- 淺談php 取餘PHP
- php-fpm的配置和優化PHP優化
- nginx 和 PHP-fpm 的互動NginxPHP
- 淺談php變數的實現-PHPPHP變數
- Mac下Nginx、PHP、MySQL 和 PHP-fpm安裝配置MacNginxPHPMySql
- Mac PHP-fpmMacPHP
- 淺談PHP弱型別安全PHP型別
- 淺談php count()函式方法PHP函式
- PHP7中php.ini、php-fpm和www.conf 配置PHP
- CGI和FastCGIAST
- PHP-FPM vs SwoolePHP
- php-fpm報錯PHP
- 淺談BSGS和EXBSGS
- nginx + PHP-fpm 配置示例NginxPHP
- php-fpm相關配置PHP
- php-fpm 配置詳解PHP
- PHP-FPM 是什麼?PHP
- 淺談PHP物件導向程式設計PHP物件程式設計
- 淺談 PHP 中異常類的使用PHP
- ubuntn 重啟 PHP-fpm 修改 php.iniPHP
- php-fpm的最佳化PHP
- linux php-fpm 如何重啟LinuxPHP
- cgi和fast-cgi以及php-fpm的聯絡和區別ASTPHP
- 關於 PHP-fpm master 程式和 worker 職責探討PHPAST
- 淺談mouseenter和mouseover,mouseout和mouseleave
- iis + php 遇到問題:php-cgi.exe - FastCGI 程式意外退出PHPAST