PHP 之 FastCGI 與 mod_php

網上對於FastCGI與mod_php的知識比較雜亂而不全面,故在此整理一下,以便入門學習者查閱方便。 背景PHP最經常使用的方式是以模塊的方式(mod_php)運行在Apache中,也是Apache運行PHP的默認方式;但在Nginx中,Nginx又使用的是PHP-FPM,可是PHP-FPM究竟是個什麼東東?跟php有什麼關係?今天咱們一塊兒來探究一番。php

網上對於FastCGI與mod_php的知識比較雜亂而不全面,故在此整理一下,以便入門學習者查閱方便。html

背景java

PHP最經常使用的方式是以模塊的方式(mod_php)運行在Apache中,也是Apache運行PHP的默認方式;但在Nginx中,Nginx又使用的是PHP-FPM,可是PHP-FPM究竟是個什麼東東?跟php有什麼關係?今天咱們一塊兒來探究一番。python

PHP處理器(PHP handlers)web

首先須要記住的是,任何一種Web服務器(Apache、Nginx等)都是被設計成向用戶發送html、圖片等靜態資源的,Web服務器自身並不能解釋任何動態腳本(PHP、Python等)。編程

PHP處理器就是用來解釋Web應用中的PHP代碼,並將它解釋爲HTML或其餘靜態資源,而後將解析的結果傳給Web服務器,最後再由Web服務器發送給用戶。瀏覽器

大多數的Web服務器都不能解析PHP代碼,所以它須要一個能解析PHP代碼的程序,這就是PHP處理器。服務器

如今咱們知道了,Apache與Nginx都須要PHP處理器來處理php代碼,那麼怎麼鏈接上服務器與php處理器呢?也就是說服務器與php處理器如何通訊?架構

答案是經過SAPI(Server Application Programming Interface 服務器端應用編程端口),簡單來講,SAPI指的是PHP具體應用的編程接口, 就像PC同樣,不管安裝哪些操做系統,只要知足了PC的接口規範均可以在PC上正常運行, PHP腳本要執行有不少種方式,經過Web服務器,或者直接在命令行下,也能夠嵌入在其餘程序中,有興趣你們能夠研究PHP內核。app

咱們這裏繼續討論PHP最經常使用的SAPI提供的2種鏈接方法:mod_php和mod_fastcgi。

mod_php模式

我們回顧一下,Apache是怎麼可以識別php代碼的?是否是Apache的配置文件httpd.conf中加上或者修改這樣幾句:

//添加

LoadModulephp5_module modules/libphp5.so

AddTypeapplication/x-httpd-php.php

//修改

 

DirectoryIndexindex.php index.html index.htm index.html

也即php做爲Apache的一個子模塊來運行,當經過web訪問php文件時,Apache就會調用php5_module來解析php代碼。

配置加載mod_php模塊後,php即是Apahce進程自己一部分,每一個新的Apache子進程都會加載此模塊。

mod_fastcgi模式

咱們先看PHP-FPM官網的說明:

PHP-FPM - A simple and robust FastCGI Process Manager for PHP

PHP-FPM (FastCGI Process Manager) is an alternative PHP FastCGI implementation with some additional features useful for sites of any size, especially busier sites.

PHP-FPM是一個PHP的FastCGI進程管理器,解釋的很是簡單。這說明PHP-FPM是輔助mod_fastcgi模式進行工做的,然而FastCGI又是個什麼東西?管理着什麼進程?

什麼是CGI?

CGI(Common Gateway Interface) 是WWW技術中最重要的技術之一,有着不可替代的重要地位。

CGI是外部應用程序(CGI程序)與Web服務器之間的接口標準,是在CGI程序和Web服務器之間傳遞信息的規程。

CGI規範容許Web服務器執行外部程序,並將它們的輸出發送給Web瀏覽器,CGI將Web的一組簡單的靜態超媒體文檔變成一個完整的新的交互式媒體。

說白了,CGI是一種外部應用程序(CGI程序)與Web服務器的協議,CGI是爲了保證Server傳遞過來的數據是標準格式。

什麼是FastCGI?

FastCGI像是一個常駐(long-live)型的CGI,它能夠一直執行着,只要激活後,不會每次都要花費時間去fork一次(這是CGI最爲人詬病的fork-and-execute 模式)。它還支持分佈式的運算, 即 FastCGI 程序能夠在網站服務器之外的主機上執行而且接受來自其它網站服務器來的請求。

FastCGI是語言無關的、可伸縮架構的CGI開放擴展,其主要行爲是將CGI解釋器進程保持在內存中並所以得到較高的性能。衆所周知,CGI解釋器的反覆加載是CGI性能低下的主要緣由,若是CGI解釋器保持在內存中並接受FastCGI進程管理器調度,則能夠提供良好的性能、伸縮性、Fail- Over特性等等。

通常狀況下,FastCGI的整個工做流程是這樣的:

Web Server啓動時載入FastCGI進程管理器(IIS ISAPI或Apache Module)。

FastCGI進程管理器自身初始化,啓動多個CGI解釋器進程(可見多個php-cgi)並等待WebServer的鏈接。

當客戶端請求到達Web Server時,FastCGI進程管理器選擇並鏈接到一個CGI解釋器。 Web server將CGI環境變量和標準輸入發送到FastCGI子進程php-cgi。

FastCGI子進程完成處理後將標準輸出和錯誤信息從同一鏈接返回Web Server。當FastCGI子進程關閉鏈接時,請求便告處理完成,FastCGI子進程接着等待並處理來自FastCGI進程管理器(運行在Web Server中)的下一個鏈接,在CGI模式中,php-cgi在此便已經退出。

也就是說FastCGI是CGI的升級版,一種語言無關的協議,用來溝通程序(如PHP, Python,Java)和Web服務器(Apache2, Nginx), 理論上任何語言編寫的程序均可以經過FastCGI來提供Web服務。

FastCGI的特色是會在一個進程中依次完成多個請求,以達到提升效率的目的,大多數FastCGI實現都會維護一個進程池。

通俗解釋:FastCGI事先就須要啓動,並且能夠啓動多個CGI模塊,在那裏一直運行等着web發請求,而後再給php解析運算,完成後生成html返回給web後,可是完成後它不會退出,而是繼續等着下一個web請求。

PHP-FPM

PHP-FPM就是針對於PHP的FastCGI的一種實現,他負責管理一個進程池,來處理來自Web服務器的請求。

可是PHP-FPM僅僅是個「PHP FastCGI 進程管理器」, 它仍會調用PHP解釋器自己來處理請求,PHP解釋器(在Windows下)就是php-cgi.exe。

更多PHP相關技術請搜索千鋒PHP,作真實的本身,用良心作教育。

互聯網+時代,時刻要保持學習,攜手千鋒PHP,Dream

It Possible。

相關文章
相關標籤/搜索