五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > CGI、FastCGI和PHP-FPM關(guān)系圖解概念和區(qū)別

CGI、FastCGI和PHP-FPM關(guān)系圖解概念和區(qū)別

文章來(lái)源:365jz.com     點(diǎn)擊數(shù):529    更新時(shí)間:2018-07-25 10:13   參與評(píng)論

在搭建 LAMP/LNMP 服務(wù)器時(shí),會(huì)經(jīng)常遇到 PHP-FPM、FastCGI和CGI 這幾個(gè)概念。如果對(duì)它們一知半解,很難搭建出高性能的服務(wù)器。接下來(lái)我們就以圖形方式,解釋這些概念之間的關(guān)系。

基礎(chǔ)

在整個(gè)網(wǎng)站架構(gòu)中,Web Server(如Apache)只是內(nèi)容的分發(fā)者。舉個(gè)栗子,如果客戶端請(qǐng)求的是 index.html,那么Web Server會(huì)去文件系統(tǒng)中找到這個(gè)文件,發(fā)送給瀏覽器,這里分發(fā)的是靜態(tài)數(shù)據(jù)。

如果請(qǐng)求的是 index.php,根據(jù)配置文件,Web Server知道這個(gè)不是靜態(tài)文件,需要去找 PHP 解析器來(lái)處理,那么他會(huì)把這個(gè)請(qǐng)求簡(jiǎn)單處理,然后交給PHP解析器。

當(dāng)Web Server收到 index.php 這個(gè)請(qǐng)求后,會(huì)啟動(dòng)對(duì)應(yīng)的 CGI 程序,這里就是PHP的解析器。接下來(lái)PHP解析器會(huì)解析php.ini文件,初始化執(zhí)行環(huán)境,然后處理請(qǐng)求,再以規(guī)定CGI規(guī)定的格式返回處理后的結(jié)果,退出進(jìn)程,Web server再把結(jié)果返回給瀏覽器。這就是一個(gè)完整的動(dòng)態(tài)PHP Web訪問(wèn)流程,接下來(lái)再引出這些概念,就好理解多了,

  • CGI:是 Web Server 與 Web Application 之間數(shù)據(jù)交換的一種協(xié)議。

  • FastCGI:同 CGI,是一種通信協(xié)議,但比 CGI 在效率上做了一些優(yōu)化。同樣,SCGI 協(xié)議與 FastCGI 類似。

  • PHP-CGI:是 PHP (Web Application)對(duì) Web Server 提供的 CGI 協(xié)議的接口程序。

  • PHP-FPM:是 PHP(Web Application)對(duì) Web Server 提供的 FastCGI 協(xié)議的接口程序,額外還提供了相對(duì)智能一些任務(wù)管理。

WEB 中,

  • Web Server 一般指Apache、Nginx、IIS、Lighttpd、Tomcat等服務(wù)器,

  • Web Application 一般指PHP、Java、Asp.net等應(yīng)用程序。

Module方式

在了解 CGI 之前,我們先了解一下Web server 傳遞數(shù)據(jù)的另外一種方法:PHP Module加載方式。以 Apache 為例,在PHP Module方式中,是不是在 Apache 的配置文件 httpd.conf 中加上這樣幾句:

# 加入以下2句LoadModule php5_module D:/php/php5apache2_2.dllAddType application/x-httpd-php .php# 修改如下內(nèi)容<IfModule dir_module>
    DirectoryIndex index.php index.html</IfModule>

上面是 Windows 下安裝php和apache環(huán)境后手動(dòng)配置,在linux下源碼安裝大致是這樣配置的:

# ./configure --with-mysql=/usr/local --with-apache=/usr/local/apache --enable-track-vars

所以,這種方式,他們的共同本質(zhì)都是用 LoadModule 來(lái)加載 php5_module,就是把php作為apache的一個(gè)子模塊來(lái)運(yùn)行。當(dāng)通過(guò)web訪問(wèn)php文件時(shí),apache就會(huì)調(diào)用php5_module來(lái)解析php代碼。

那么php5_module是怎么來(lái)將數(shù)據(jù)傳給php解析器來(lái)解析php代碼的呢?答案是通過(guò)sapi。

我們?cè)賮?lái)看一張圖,詳細(xì)的說(shuō)說(shuō)apache 與 php 與 sapi的關(guān)系:

mode_php

從上面圖中,我們看出了sapi就是這樣的一個(gè)中間過(guò)程,SAPI提供了一個(gè)和外部通信的接口,有點(diǎn)類似于socket,使得PHP可以和其他應(yīng)用進(jìn)行交互數(shù)據(jù)(apache,nginx等)。php默認(rèn)提供了很多種SAPI,常見的提供給apache和nginx的php5_module、CGI、FastCGI,給IIS的ISAPI,以及Shell的CLI。

所以,以上的apache調(diào)用php執(zhí)行的過(guò)程如下:

apache -> httpd -> php5_module -> sapi -> php

好了。apache與php通過(guò)php5_module的方式就搞清楚了吧!

這種模式將php模塊安裝到apache中,所以每一次apache結(jié)束請(qǐng)求,都會(huì)產(chǎn)生一條進(jìn)程,這個(gè)進(jìn)程就完整的包括php的各種運(yùn)算計(jì)算等操作。

在上圖中,我們很清晰的可以看到,apache每接收一個(gè)請(qǐng)求,都會(huì)產(chǎn)生一個(gè)進(jìn)程來(lái)連接php通過(guò)sapi來(lái)完成請(qǐng)求,可想而知,如果一旦用戶過(guò)多,并發(fā)數(shù)過(guò)多,服務(wù)器就會(huì)承受不住了。

而且,把mod_php編進(jìn)apache時(shí),出問(wèn)題時(shí)很難定位是php的問(wèn)題還是apache的問(wèn)題。

CGI

CGI(Common Gateway Interface)全稱是“通用網(wǎng)關(guān)接口”,WEB 服務(wù)器與PHP應(yīng)用進(jìn)行“交談”的一種工具,其程序須運(yùn)行在網(wǎng)絡(luò)服務(wù)器上。CGI可以用任何一種語(yǔ)言編寫,只要這種語(yǔ)言具有標(biāo)準(zhǔn)輸入、輸出和環(huán)境變量。如php、perl、tcl等。

WEB服務(wù)器會(huì)傳哪些數(shù)據(jù)給PHP解析器呢?URL、查詢字符串、POST數(shù)據(jù)、HTTP header都會(huì)有。所以,CGI就是規(guī)定要傳哪些數(shù)據(jù),以什么樣的格式傳遞給后方處理這個(gè)請(qǐng)求的協(xié)議。仔細(xì)想想,你在PHP代碼中使用的用戶從哪里來(lái)的。

也就是說(shuō),CGI就是專門用來(lái)和 web 服務(wù)器打交道的。web服務(wù)器收到用戶請(qǐng)求,就會(huì)把請(qǐng)求提交給cgi程序(如php-cgi),cgi程序根據(jù)請(qǐng)求提交的參數(shù)作應(yīng)處理(解析php),然后輸出標(biāo)準(zhǔn)的html語(yǔ)句,返回給web服服務(wù)器,WEB服務(wù)器再返回給客戶端,這就是普通cgi的工作原理。

CGI的好處就是完全獨(dú)立于任何服務(wù)器,僅僅是做為中間分子。提供接口給apache和php。他們通過(guò)cgi搭線來(lái)完成數(shù)據(jù)傳遞。這樣做的好處了盡量減少2個(gè)的關(guān)聯(lián),使他們2變得更獨(dú)立。

但是CGI有個(gè)蛋疼的地方,就是每一次web請(qǐng)求都會(huì)有啟動(dòng)和退出過(guò)程,也就是最為人詬病的fork-and-execute模式,這樣一在大規(guī)模并發(fā)下,就死翹翹了。

FastCGI介紹

FastCGI簡(jiǎn)單介紹

從根本上來(lái)說(shuō),F(xiàn)astCGI是用來(lái)提高CGI程序性能的。類似于CGI,FastCGI也可以說(shuō)是一種協(xié)議。

FastCGI像是一個(gè)常駐(long-live)型的CGI,它可以一直執(zhí)行著,只要激活后,不會(huì)每次都要花費(fèi)時(shí)間去fork一次。它還支持分布式的運(yùn)算, 即 FastCGI 程序可以在網(wǎng)站服務(wù)器以外的主機(jī)上執(zhí)行,并且接受來(lái)自其它網(wǎng)站服務(wù)器來(lái)的請(qǐng)求。

FastCGI是語(yǔ)言無(wú)關(guān)的、可伸縮架構(gòu)的CGI開放擴(kuò)展,其主要行為是將CGI解釋器進(jìn)程保持在內(nèi)存中,并因此獲得較高的性能。眾所周知,CGI解釋器的反復(fù)加載是CGI性能低下的主要原因,如果CGI解釋器保持在內(nèi)存中,并接受FastCGI進(jìn)程管理器調(diào)度,則可以提供良好的性能、伸縮性、Fail- Over特性等等。

FastCGI的工作原理

FastCGI接口方式采用C/S結(jié)構(gòu),可以將HTTP服務(wù)器和腳本解析服務(wù)器分開,同時(shí)在腳本解析服務(wù)器上啟動(dòng)一個(gè)或者多個(gè)腳本解析守護(hù)進(jìn)程。當(dāng)HTTP服務(wù)器每次遇到動(dòng)態(tài)程序時(shí),可以將其直接交付給FastCGI進(jìn)程來(lái)執(zhí)行,然后將得到的結(jié)果返回給瀏覽器。這種方式可以讓HTTP服務(wù)器專一地處理靜態(tài)請(qǐng)求,或者將動(dòng)態(tài)腳本服務(wù)器的結(jié)果返回給客戶端,這在很大程度上提高了整個(gè)應(yīng)用系統(tǒng)的性能。

fastcgi

  1. Web Server啟動(dòng)時(shí)載入FastCGI進(jìn)程管理器(Apache Module或IIS ISAPI等)

  2. FastCGI進(jìn)程管理器自身初始化,啟動(dòng)多個(gè)CGI解釋器進(jìn)程(可建多個(gè)php-cgi),并等待來(lái)自Web Server的連接。

  3. 當(dāng)客戶端請(qǐng)求到達(dá)Web Server時(shí),F(xiàn)astCGI進(jìn)程管理器選擇并連接到一個(gè)CGI解釋器。Web server將CGI環(huán)境變量和標(biāo)準(zhǔn)輸入發(fā)送到FastCGI子進(jìn)程php-cgi。

  4. FastCGI子進(jìn)程完成處理后,將標(biāo)準(zhǔn)輸出和錯(cuò)誤信息從同一連接返回Web Server。當(dāng)FastCGI子進(jìn)程關(guān)閉連接時(shí),請(qǐng)求便告處理完成。FastCGI子進(jìn)程接著等待,并處理來(lái)自FastCGI進(jìn)程管理器(運(yùn)行在Web Server中)的下一個(gè)連接。 在CGI模式中,php-cgi在此便退出了。

FastCGI與CGI特點(diǎn):

  1. 對(duì)于CGI來(lái)說(shuō),每一個(gè)Web請(qǐng)求PHP都必須重新解析php.ini、重新載入全部擴(kuò)展,并重新初始化全部數(shù)據(jù)結(jié)構(gòu)。而使用FastCGI,所有這些都只在進(jìn)程啟動(dòng)時(shí)發(fā)生一次。一個(gè)額外的好處是,持續(xù)數(shù)據(jù)庫(kù)連接(Persistent database connection)可以工作。

  2. 由于FastCGI是多進(jìn)程,所以比CGI多線程消耗更多的服務(wù)器內(nèi)存,php-cgi解釋器每進(jìn)程消耗7至25兆內(nèi)存,將這個(gè)數(shù)字乘以50或100就是很大的內(nèi)存數(shù)。

PHP-FPM介紹

要了解PHP-FPM,就得先說(shuō)說(shuō)PHP-CGI。

PHP-CGI就是PHP實(shí)現(xiàn)的自帶的FastCGI管理器。 雖然是php官方出品,但是這丫的卻一點(diǎn)也不給力,性能太差,而且也很麻煩不人性化,主要體現(xiàn)在:

  1. php-cgi變更php.ini配置后,需重啟php-cgi才能讓新的php-ini生效,不可以平滑重啟。

  2. 直接殺死php-cgi進(jìn)程,php就不能運(yùn)行了。

上面2個(gè)問(wèn)題,一直讓很多人病垢了很久,所以很多人一直還是在用 Module 方式。 直到 2004年一個(gè)叫 Andrei Nigmatulin的屌絲發(fā)明了PHP-FPM ,這神器的出現(xiàn)就徹底打破了這種局面,這是一個(gè)PHP專用的 fastcgi 管理器,它很爽的克服了上面2個(gè)問(wèn)題,而且,還表現(xiàn)在其他方面更表現(xiàn)強(qiáng)勁。

也就是說(shuō),PHP-FPM 是對(duì)于 FastCGI 協(xié)議的具體實(shí)現(xiàn),他負(fù)責(zé)管理一個(gè)進(jìn)程池,來(lái)處理來(lái)自Web服務(wù)器的請(qǐng)求。目前,PHP5.3版本之后,PHP-FPM是內(nèi)置于PHP的

因?yàn)镻HP-CGI只是個(gè)CGI程序,他自己本身只能解析請(qǐng)求,返回結(jié)果,不會(huì)進(jìn)程管理。所以就出現(xiàn)了一些能夠調(diào)度 php-cgi 進(jìn)程的程序,比如說(shuō)由lighthttpd分離出來(lái)的spawn-fcgi。同樣,PHP-FPM也是用于調(diào)度管理PHP解析器php-cgi的管理程序。

PHP-FPM通過(guò)生成新的子進(jìn)程可以實(shí)現(xiàn)php.ini修改后的平滑重啟。

總結(jié)

最后,我們來(lái)總結(jié)一下,這些技術(shù)經(jīng)過(guò)不斷的升級(jí),可以解決什么問(wèn)題(不然也不會(huì)升級(jí)嘛)。

所以,如果要搭建一個(gè)高性能的PHP WEB服務(wù)器,目前最佳的方式是Apache/Nginx + FastCGI + PHP-FPM(+PHP-CGI)方式了,不要再使用 Module加載或者 CGI 方式啦:)

總結(jié):

CGI、FastCGI和php-fpm的概念和區(qū)別

CGI是HTTP Server和一個(gè)獨(dú)立的進(jìn)程之間的協(xié)議,把HTTP Request的Header設(shè)置成進(jìn)程的環(huán)境變量,HTTP Request的正文設(shè)置成進(jìn)程的標(biāo)準(zhǔn)輸入,而進(jìn)程的標(biāo)準(zhǔn)輸出就是HTTP Response包括Header和正文。

FASTCGI是和HTTP協(xié)議類似的概念。無(wú)非就是規(guī)定了在同一個(gè)TCP連接里怎么同時(shí)傳多個(gè)HTTP連接。這實(shí)際上導(dǎo)致了個(gè)問(wèn)題,有個(gè)HTTP連接傳個(gè)大文件不肯讓出FASTCGI連接,在同一個(gè)FASTCGI連接里的其他HTTP連接就傻了。所以Lighttpd? 引入了 X-SENDFILE 。

php-fpm就相當(dāng)于是Apache+mod_php。無(wú)非php-fpm自帶了FASTCGI Server,而Apache是HTTP Server。

那個(gè)WSGI和這個(gè)問(wèn)題沒(méi)啥關(guān)系吧。WSGI這個(gè)只是Python內(nèi)部的一個(gè)接口。無(wú)論你前面是FASTCGI,HTTP,SCGI,uWSGI等協(xié)議,你的FASTCGI/HTTP/SCGI/uWSGI Server都以相同的參數(shù)格式去調(diào)用一個(gè)函數(shù),這樣你用Python寫的Web應(yīng)用并不需要修改代碼,就可以運(yùn)行在不同的Server后面了。無(wú)非CGI協(xié)議是進(jìn)程間的,而WSGI是進(jìn)程內(nèi)的。

 

1. 一般web服務(wù)器接受到瀏覽器的請(qǐng)求時(shí),如果是靜態(tài)資源的話就直接將其返回給瀏覽器,如果是動(dòng)態(tài)資源的話那就沒(méi)有現(xiàn)成的資源返回了,那這個(gè)時(shí)候cgi就出場(chǎng)了

2. cgi可以理解為一種協(xié)議or一類處理程序,就是動(dòng)態(tài)去生成文件,從程序上來(lái)理解就是web服務(wù)器exec這樣一個(gè)進(jìn)程,然后交給他一些輸入?yún)?shù),他就慢慢的處理完后把結(jié)果返回給web服務(wù)器,那從協(xié)議層面來(lái)說(shuō)cgi協(xié)議就是規(guī)范了web服務(wù)器和cgi程序的一些輸入輸出參數(shù)的含義

3.所以可以有很多不同的cgi程序,別可以執(zhí)行php腳本的or可以執(zhí)行python腳本的,只要符合這類規(guī)范就能供web服務(wù)器調(diào)用,當(dāng)然它的缺點(diǎn)就是每次都需要去啟動(dòng)這個(gè)cgi程序,這會(huì)使得處理速度很慢

4.針對(duì)這種缺陷加以改進(jìn)就成了fastcgi,同樣的他也可以理解為一種協(xié)議or一個(gè)程序,它跟cgi的不同就是不需要每次去exec,它會(huì)事先啟動(dòng)起來(lái),作為一個(gè)cgi的管理服務(wù)器存在,預(yù)先啟動(dòng)一系列的子進(jìn)程來(lái)等待處理,然后等待web服務(wù)器發(fā)過(guò)來(lái)的請(qǐng)求,一旦接受到請(qǐng)求就交由子進(jìn)程處理,這樣由于不需要在接受到請(qǐng)求后啟動(dòng)cgi,會(huì)快很多。

5.phpfpm是php對(duì)fastcgi的一種具體實(shí)現(xiàn),它的啟動(dòng)后會(huì)創(chuàng)建多個(gè)cgi子進(jìn)程,然后主進(jìn)程負(fù)責(zé)管理子進(jìn)程,同時(shí)它對(duì)外提供一個(gè)socket,那web服務(wù)器當(dāng)要轉(zhuǎn)發(fā)一個(gè)動(dòng)態(tài)請(qǐng)求時(shí)只需要按照f(shuō)astcgi協(xié)議要求的格式將數(shù)據(jù)發(fā)往這個(gè)socket的就可以了,那phpfpm創(chuàng)建的子進(jìn)程去爭(zhēng)搶這個(gè)socket連接,誰(shuí)搶到了誰(shuí)處理并將結(jié)果返回給web服務(wù)器,那phpfpm主進(jìn)程干什么了?比方說(shuō)其中一個(gè)子進(jìn)程異常退出了怎么辦,那phpfpm會(huì)去監(jiān)控他一旦發(fā)現(xiàn)一個(gè)cgi子進(jìn)程就會(huì)又啟動(dòng)一個(gè),還有其他諸多管理功能

6 phpfpm作為一個(gè)獨(dú)立的進(jìn)程存在 通過(guò)socket與nginx建立連接,而mod_php 是作為一個(gè)模塊被加載進(jìn)了apache服務(wù)器,同時(shí)他們兩作為cgi調(diào)度管理器,他們對(duì)其管理的方式也不一樣

通俗的可以把服務(wù)器看作餐廳,用戶請(qǐng)求看作來(lái)用餐的顧客,服務(wù)器處理請(qǐng)求看作解決顧客的就餐問(wèn)題(響應(yīng)輸出一份飯)。

服務(wù)器上靜態(tài)資源看作已做好的飯,只要放到餐盒里就可以返回給顧客,動(dòng)態(tài)資源需要廚房大廚現(xiàn)成做份再放到餐盒里返回給顧客。

php_mod這個(gè)大廚有個(gè)特點(diǎn),看見有顧客進(jìn)門就點(diǎn)火,不管顧客要不要現(xiàn)做的,有點(diǎn)浪費(fèi)資源

php_fpm這個(gè)大廚有好多小弟一直點(diǎn)著火(多個(gè)處理進(jìn)程),等有顧客說(shuō)要現(xiàn)做,大廚就安排小弟做份返回給客戶

cgi也是個(gè)大廚,不過(guò)他等到顧客要現(xiàn)做,他才點(diǎn)火,做飯,然后熄火。等待下一個(gè)要現(xiàn)做的到來(lái)

fastcgi呢就是個(gè)大廚雇了一幫小弟,專門做需要現(xiàn)場(chǎng)做的飯,大廚只管分派任務(wù),小弟真正操鍋?zhàn)鲲?/p>


如對(duì)本文有疑問(wèn),請(qǐng)?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答!! 點(diǎn)擊進(jìn)入論壇

發(fā)表評(píng)論 (529人查看0條評(píng)論)
請(qǐng)自覺(jué)遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
昵稱:
最新評(píng)論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時(shí)間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號(hào)