php中fastcgi和php-fpm是什麼東西

最近在研究和學習php的性能方面的知識,看到了factcgi以及php-fpm,發現我對他們是少之又少的理解,能夠說幾乎是一無所知,想一想仍是蠻可怕的。決定仔細的學習一下關於這方面的知識。php

參考和學習瞭如下文章: 
1. mod_php和mod_fastcgi和php-fpm的介紹,對比,和性能數據 
2. 實戰Nginx_取代html

爲了如何一步步的引出fastcgi和php-fpm,我先一點一點的說說關於php的周邊。哎。忽然以爲人活着好累!mysql

 

先說說web服務器

php是爲web而生的一門後端語言,咱們php狗固然是最清楚的啦。因此php僅僅是一門後端語言,那麼它就必須藉助於web服務器,才能提供web功能。固然其餘的後端語言若是作web應用,也必須藉助於web服務器。好,由php引出了web服務器,不錯!linux

那麼常見的web服務器有哪些呢?php狗用的最多的就是Apache了,還有其餘的:nginx

  • apache
  • nginx
  • IIS
  • lighttpd
  • tomcat

基本上就是上面幾種,與php相關聯起來用的最多的就是Apache和Nginx了。web

咱們先舉例用apache看成web服務器,來講明一次完整的php訪問的狀況: 
php web 執行圖 
圖片中就很好的解釋了php與Apache結合mysql數據庫的一次完成的web訪問流程圖sql

 

mod_php模式

上面講清楚了php必須藉助於web服務器才能提供web的功能服務,如今看下他倆是怎麼成爲基友的。數據庫

咱們用到的最多的就是Apache了。那麼回憶一下,如何使apache是怎麼可以識別php代碼的?是否是apache的配置文件httpd.conf中加上或者修改這樣幾句:apache

 
 1 /加入如下2句
 2 LoadModule php5_module D:/php/php5apache2_2.dll
 3 AddType application/x-httpd-php .php
 4 //將下面的
 5 <IfModule dir_module>
 6 DirectoryIndex index.html
 7 </IfModule>
 8 //將其修改成:
 9 <IfModule dir_module>
10 DirectoryIndex index.html index.htm index.php index.phtml
11 </IfModule>

上面的windows下安裝php和apache環境後的手動配置,在linux下源碼安裝大體是這樣配置的:windows

 
./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的關係:

php運行

從上面圖中,咱們看出了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 服務器打交道的。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_fastcgimod_php 模式會將php模塊安裝到apache下面來運行,2者結合度較大。mod_fastcgi模式則是做爲一箇中間過程,apache介紹用戶請求後,就發送給fastcgi, 再鏈接php來完成訪問。

 

圖形表示一下這2種模式

 

mod_php 模式

mod_php 模式是將php模塊安裝到apache中,因此每一次apache結束的請求呢,都會產生一條進程,這個進程就完整的包括php的各類運算計算等操做。

mode_php 
從圖中咱們很清晰的能夠看到,apache每接收一個請求,都會產生一個進程來鏈接php經過sapi來完成請求,可想而知,若是一旦用戶過多,併發數過多,服務器就會承受不住了。

並且,把mod_php編進apache時,出問題時很難定位是php的問題仍是apache的問題。

 

mod_fastcgi 模式

mod_fastcgi模式則剛剛相反,fastcgi是一個獨立與apache和php的獨立個體,它隨着apache一塊兒啓動,生成多個cig模塊,等着apache的請求:

mode_fastcgi

圖中fastcgi早早的啓動好了,靜靜的在哪裏等着,已有apache發來的httpd請求就立馬接收過來,經過調用sapi給php,完成運算。並且不會退出。這樣就能應對大規模的併發請求,由於web server的要作的事情少了,因此就更快的去處理下一個請求,這樣併發大大的。

因爲apache 與 php 獨立了。出問題,很好定位究竟是哪裏出問題了。這點也是這種模式受歡迎的緣由之一。

 

php-fpm

我了個大操,終於要說到php-fpm了。^....^

先開門見山說php-fpm是幹嗎好的了。它就是專門來輔助mode_fastcgi模式的。

嗯。很好,先知道它是幹嗎的後,咱們再回到mode_fastcgi模式。經過前面的瞎雞巴一大堆的說明,我已經搞清楚了這種模式是怎麼樣子的一種狀態了。

fastcgi 是一個與平臺無關,與語言無關,任何語言只要按照它的接口來實現,就能實現本身語言的fastcgi能力和web server 通信。

PHP-CGI就是PHP實現的自帶的FastCGI管理器。

雖然是php官方出品,自帶的,可是這丫的卻一點也不給力,性能太差,並且也很麻煩不人性化,主要體如今:

  1. php-cgi變動php.ini配置後需重啓php-cgi才能讓新的php-ini生效,不能夠平滑重啓。
  2. 直接殺死php-cgi進程,php就不能運行了。

上面2個問題,一直讓不少人病垢了好久,因此不少人一直仍是在用mode_php方式。

直到 2004年(肯定是這麼早嗎?)一個叫 Andrei Nigmatulin的屌絲髮明瞭PHP-FPM ,這神器的出現就完全打破了這種局面,這是一個PHP專用的fastcgi管理器,它很爽的克服了上面2個問題,並且,還表如今其餘方面更表現強勁. 請戳官網

我擦,這一篇貌似又瞎比比的說超時了啊。好吧。那windows和linux下安裝配置php-fpm就下一節來講吧。反正我已經已經把php-fpm和fastcgi給講清楚了。

相關文章
相關標籤/搜索