什么是mod_php和mod_fastcgi
在lamp體系中,對于apache端的php的配置,我們最常用的就是mod_php,它把php作為apache一個內(nèi)置的模塊.讓apache http服務(wù)器本身能夠支持php語言,不需要每一個請求就啟動php解釋器來解釋php.
和把webserver與php綁定起來的方式不同,fastcgi是http服務(wù)器與你的或其它機(jī)器上的程序進(jìn)行“交談”的一種工具,相當(dāng)于一個程序接口。它可以接受來自web服務(wù)器的請求,解釋輸入信息,將處理后的結(jié)果返回給服務(wù)器等。mod_fastcgi就是在apache下支持fastcgi協(xié)議的模塊。
SAPI和CLI
SAPI(Server Application Programming Interface):服務(wù)器端應(yīng)用程序接口
CLI(Command Line Interface):命令行接口
php運(yùn)行原理
對于一個基于apache的php應(yīng)用,運(yùn)行流程可以簡單歸結(jié)為:
Apache -> httpd -> mod_php -> fastcgi -> sapi -> php
mod_php
在lamp體系中,mod_php是最常使用的工作方式。在這種模式下,php被編譯為apache的一個內(nèi)置模塊,在啟動加載的時候,當(dāng)有一個php請求過來,直接在httpd進(jìn)程里完成了php的解釋運(yùn)行,將結(jié)果返回。工作原理如圖所示:
mod_fastcgi
普通cgi的工作流程:
CGI英文全程是 Command Gateway Interface,通常翻譯為公共網(wǎng)關(guān)接口,是HTTP服務(wù)器與機(jī)器上的其他程序進(jìn)行通信的一個接口。這個“其他程序”可以是使用任何計(jì)算機(jī)語言進(jìn)行編寫,例如php,python,perl等等。它通過CGI這個接口從HTTP服務(wù)器取得輸入,然后把運(yùn)行結(jié)果又通過CGI這個接口交給HTTP服務(wù)器,而HTTP服務(wù)器把這個結(jié)果送給瀏覽器。
CGI的出現(xiàn)讓W(xué)EB從靜態(tài)變?yōu)閯討B(tài),隨著web的越來越普及,很多的網(wǎng)站都需要有動態(tài)的頁面,以便與瀏覽者進(jìn)行交互。CGI的缺點(diǎn)也越來越突出,因?yàn)镠TTP要生成一個動態(tài)頁面,系統(tǒng)就必須啟動一個新的進(jìn)程以運(yùn)行CGI程序,不斷的fork是一項(xiàng)很消耗時間和資源的工作。
fastcgi工作原理:
(1)web server 啟動時載入Fastcgi進(jìn)程管理器。[php的fastcgi進(jìn)程管理器是PHP-FPM(php-FastCGI Process Manager)]
(2)Fastcgi進(jìn)程管理器自身初始化,啟動多個CGI解釋器進(jìn)程并且等待來自web server的連接。啟動php-cgi Fastcgi進(jìn)程時,可以配置TCP和unix套接字兩種方式。一般生產(chǎn)環(huán)境中采用TCP方式
(3)當(dāng)客戶端請求到達(dá)web server時,web server 通過tcp協(xié)議或者unix套接字的方式將請求轉(zhuǎn)發(fā)給Fastcgi主進(jìn)程,F(xiàn)astcgi主進(jìn)程選擇并連接一個cgi進(jìn)程。
(4)Fastcgi子進(jìn)程完成php程序流程處理后將標(biāo)準(zhǔn)輸出和錯誤信息一同返回給web server。當(dāng)Fastcgi子進(jìn)程關(guān)閉時,請求便告處理完成。Fastcgi子進(jìn)程便接著等待來自Fastcgi進(jìn)程管理器的下一個連接。
(5)fastcgi是基于cgi架構(gòu)的擴(kuò)展,他的核心思想就是在web server和具體cgi程序之間建立一個智能的可持續(xù)的中間層,統(tǒng)管cgi程序的運(yùn)行,這樣web server只需要將請求提交給這個層,這個層再派生出幾個可復(fù)用的cgi程序?qū)嵗缓笤侔颜埱蠓职l(fā)給這些實(shí)例,這些實(shí)例是可控的,可持續(xù),可復(fù)用的。mod_fastcgi的主要優(yōu)點(diǎn)是把動態(tài)語言和web server分離開來。這種技術(shù)允許把web server 和 動態(tài)語言運(yùn)行在不同的主機(jī)上,以大規(guī)模擴(kuò)展和改進(jìn)安全性而不損失生產(chǎn)效率。
基于mod_fastcgi方式的php應(yīng)用,工作流程如下:
mod_fastcgi遠(yuǎn)程配置方式
fastcgi實(shí)例和apache分離開來,這兩者可以分開來部署。他們之間的通信通過tcp或者unix sock來完成。使用ext方式,fastcgi實(shí)例是獨(dú)立運(yùn)行的。
php-fpm
使用fastcgi,最主要的優(yōu)點(diǎn)是把應(yīng)用和web server(apache)分離開來。這樣允許把web server 和動態(tài)語言(php)運(yùn)行在不同的主機(jī)上,以大規(guī)模擴(kuò)展和改進(jìn)安全性而不損失效率。
這樣情況下,對于php-cgi程序,由于從apache中分離出來,就需要一個單獨(dú)的工具來對這些進(jìn)程進(jìn)行管理,幸運(yùn)的就是php-fpm的出現(xiàn)。
特性
(1)php守護(hù)進(jìn)程:pid file,log file,setsid(),setuid(),setgid(),chroot()
(2)進(jìn)程控制,可以平滑的重啟,重新載入配置和二進(jìn)制模塊而不丟失請求
(3)限制ip地址,可以滿足web server的要求
(4)使用用不同的uid/gid/chroot/環(huán)境變量,不同的php.ini選項(xiàng),不需要safe mode
(5)記錄word process的stdout和stderr
(6)如果set_time_limit沒有起作用,強(qiáng)制結(jié)束過期進(jìn)程
特色功能:
(1)fastcgi_finish_request()函數(shù):響應(yīng)完成,關(guān)閉連接
(2)優(yōu)化上傳支持
(3)特色功能Error header
參考文獻(xiàn):
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
