PHP 之 FastCGI 與 mod_php

來源:互聯網
上載者:User

標籤:fork   httpd   cut   handlers   請求   處理   pac   獲得   handler   

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

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

背景

PHP最常用的方式是以模組的方式(mod_php)運行在Apache中,也是Apache運行PHP的預設;但在Nginx中,Nginx又使用的是PHP-FPM,但是PHP-FPM到底是個什麼東東?跟php有什麼關係?今天我們一起來探究一番。

PHP處理器(PHP handlers)

首先需要記住的是,任何一種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核心。

我們這裡繼續討論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。




PHP 之 FastCGI 與 mod_php

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.