php中fastcgi和php-fpm是什麼東西
php
最近在研究和學習php的效能方面的知識,看到了factcgi以及php-fpm,發現我對他們是少之又少的理解,可以說幾乎是一無所知,想想還是蠻可怕的。決定仔細的學習一下關於這方面的知識。
參考和學習了以下文章:
1. mod_php和mod_fastcgi和php-fpm的介紹,對比,和效能資料
2. 實戰Nginx_取代
為了如何一步步的引出fastcgi和php-fpm,我先一點一點的說說關於php的周邊。哎。突然覺得人活著好累!
先說說web伺服器
php是為web而生的一門後端語言,我們php狗當然是最清楚的啦。所以php僅僅是一門後端語言,那麼它就必須藉助於web伺服器,才能提供web功能。當然其他的後端語言如果做web應用,也必須藉助於web伺服器。好,由php引出了web伺服器,不錯!
那麼常見的web伺服器有哪些呢?php狗用的最多的就是Apache了,還有其他的:
apache
nginx
IIS
lighttpd
tomcat
基本上就是上面幾種,與php相關聯起來用的最多的就是Apache和Nginx了。
我們先舉例用apache當作web伺服器,來說明一次完整的php訪問的情況:
圖片中就很好的解釋了php與Apache結合mysql資料庫的一次完成的web訪問流程圖
mod_php模式
上面講清楚了php必須藉助於web伺服器才能提供web的功能服務,現在看下他倆是怎麼成為基友的。
我們用到的最多的就是Apache了。那麼回憶一下,如何使apache是怎麼能夠識別php代碼的?是不是apache的設定檔httpd.conf中加上或者修改這樣幾句:
//加入以下2句LoadModule php5_module D:/php/php5apache2_2.dllAddType application/x-httpd-php .php//將下面的 DirectoryIndex index.html//將其修改為: DirectoryIndex index.html index.htm index.php index.phtml
上面的windows下安裝php和apache環境後的手動設定,在linux下源碼安裝大致是這樣配置的:
./configure --with-mysql=/usr/local --with-apache=/usr/local/apache --enable-track-vars
所以,這種方式,他們的共同本質都是用LoadModule來載入php5_module,就是把php作為apache的一個子模組來運行。當通過web訪問php檔案時,apache就會調用php5_module來解析php代碼。
那麼php5_module是怎麼來將資料傳給php解析器來解析php代碼的呢?
答案是通過sapi
我們再來看一張圖,詳細的說說apache 與 php 與 sapi的關係:
從上面圖中,我們看出了sapi就是這樣的一個中間過程,SAPI提供了一個和外部通訊的介面,有點類似於socket,使得PHP可以和其他應用進行互動資料(apache,nginx,cli等)。php預設提供了很多種SAPI,常見的給apache和nginx的php5_module,CGI,給IIS的ISAPI,還有Shell的CLI。
所以,以上的apache調用php執行的過程如下:
apache -> httpd -> php5_module -> sapi -> php
好了。apache與php通過php5_module的方式就搞清楚了吧!
我們把這種運行方式叫做mod_php模式
mod_fastcgi模式
上面我們仔細說了php與apache通過php5_module,php5_module通過sapi的方式訪問php,來達到php web的整個流程。
上面也說到了sapi,sapi是php提供的統一介面,它提供給了php5_module和cgi等方式供web伺服器來連結和解析php代碼。上面講到的php5_module載入模式,我們稱之為mod_php模式。
那麼!噹噹噹噹!馬上就要說出fastcgi模式了。哈哈哈哈哈,太不容了。
那麼php的sapi的另一種方式就是提供cgi模式,由於cgi比較老所以就出現了fastcgi來取代它。
所以,哎。沒辦法,又要說什麼是CGI了?
CGI(Common Gateway Interface)。CGI是外部應用程式(CGI程式)與Web伺服器之間的介面標準,是在CGI程式和Web伺服器之間傳遞資訊的規程。CGI規範允許Web伺服器執行外部程式,並將它們的輸出發送給Web瀏覽器,CGI將Web的一組簡單的靜態超媒體文檔變成一個完整的新的互動式媒體。
看官方的解釋就蛋疼,簡單的說,就是:cgi就是專門用來和網頁伺服器打交道的。web伺服器收到使用者請求,就會把請求提交給cgi程式(php的fastcgi),cgi程式根據請求提交的參數作應處理(解析php),然後輸出標準的html語句返回給web服伺服器,再返回給用戶端,這就是普通cgi的工作原理。
cgi的好處就是完全獨立於任何伺服器,僅僅是做為中間分子。提供介面給apache和php。他們通過cgi搭線來完成搞基動作。這樣做的好處了盡量減少2個的關聯,使他們2變得更獨立。
但是cgi有個蛋疼的地方,就是每一次web請求都會有啟動和退出過程,也就是最為人詬病的fork-and-execute模式,這樣一在大規模並發下,就死翹翹了。
所以。這個時候fastcgi運用而生了。它事先就早早的啟動好了,而且可以啟動多個cgi模組,在那裡一直運行著等著,等著web發過來的請求,然後再給php解析運算完成組建html給web後,也不會退出,而且繼續等著下一個web請求。而且這些cgi的模組啟動是可控的,可監測的。這種技術還允許把web server和php運行在不同的主機上,以大規模擴充和改進安全性而不損失生產效率。
所以現在一般作業系統都是fastcgi模式。cig模式也慢慢退出了曆史舞台!我們文章中說cgi一般也就指fastcgi。
所以把這種運行方式叫做mod_fastcgi模式
我會在接下來的段落講如何使用fastcgi模式來串連php和apache(或者nginx)
總結一下:php 與 apache 或者 ngix 結合, 會用sapi 提供2種串連方法:mod_php和mod_fastcgi。mod_php 模式會將php模組安裝到apache下面來運行,2者結合度較大。mod_fastcgi模式則是作為一個中間過程,apache介紹使用者請求後,就發送給fastcgi, 再串連php來完成訪問。
圖形表示一下這2種模式
mod_php 模式
mod_php 模式是將php模組安裝到apache中,所以每一次apache結束的請求呢,都會產生一條進程,這個進程就完整的包括php的各種運算計算等操作。
我們很清晰的可以看到,apache每接收一個請求,都會產生一個進程來串連php通過sapi來完成請求,可想而知,如果一旦使用者過多,並發數過多,伺服器就會承受不住了。
而且,把mod_php編進apache時,出問題時很難定位是php的問題還是apache的問題。
mod_fastcgi 模式
mod_fastcgi模式則剛剛相反,fastcgi是一個獨立與apache和php的獨立個體,它隨著apache一起啟動,產生多個cig模組,等著apache的請求:
圖中fastcgi早早的啟動好了,靜靜的在哪裡等著,已有apache發來的httpd請求就立馬接收過來,通過調用sapi給php,完成運算。而且不會退出。這樣就能應對大規模的並發請求,因為web server的要做的事情少了,所以就更快的去處理下一個請求,這樣並發大大的。
由於apache 與 php 獨立了。出問題,很好定位到底是哪裡出問題了。這點也是這種模式受歡迎的原因之一。
php-fpm
我了個大操,終於要說到php-fpm了。^....^
先開門見山說php-fpm是幹嘛好的了。它就是專門來輔助mode_fastcgi模式的。
嗯。很好,Crowdsourced Security Testing道它是幹嘛的後,我們再回到mode_fastcgi模式。通過前面的瞎雞巴一大堆的說明,我已經搞清楚了這種模式是怎麼樣子的一種狀態了。
fastcgi 是一個與平台無關,與語言無關,任何語言只要按照它的介面來實現,就能實現自己語言的fastcgi能力和web server 通訊。
PHP-CGI就是PHP實現的內建的FastCGI管理器。
雖然是php官方出品,內建的,但是這丫的卻一點也不給力,效能太差,而且也很麻煩不人性化,主要體現在:
php-cgi變更php.ini配置後需重啟php-cgi才能讓新的php-ini生效,不可以平滑重啟。
直接殺死php-cgi進程,php就不能運行了。
上面2個問題,一直讓很多人病垢了很久,所以很多人一直還是在用mode_php方式。
直到 2004年(確定是這麼早嗎?)一個叫 Andrei Nigmatulin的�絲髮明了PHP-FPM ,這神器的出現就徹底打破了這種局面,這是一個PHP專用的fastcgi管理器,它很爽的克服了上面2個問題,而且,還表現在其他方面更表現強勁. 請戳官網
我擦,這一篇貌似又瞎比比的說逾時了啊。好吧。那windows和linux下安裝配置php-fpm就下一節來說吧。反正我已經已經把php-fpm和fastcgi給講清楚了。
出處:https://www.zybuluo.com/phper/note/50231