日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

cgi web 调用多次启动_全面了解CGI、FastCGI、PHPFPM

發(fā)布時間:2025/3/8 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cgi web 调用多次启动_全面了解CGI、FastCGI、PHPFPM 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、拋個磚

1、Web Server傳遞數(shù)據(jù)的方法

正式說CGI之前,先來了解一下Web Server傳遞數(shù)據(jù)的另外一種方法:PHP Module加載方式。相信都會想起Apache吧,初學(xué)php時,在windows上安裝完php和Apache之后,為了讓Apache能夠解析php代碼,我們會在Apache的配置文件(httpd.conf)中添加如下配置:

#添加下邊兩行LoadModule php5_module D:/php/php5apache2_2.dllAddType application/x-httpd-php .php# 修改如下內(nèi)容 DirectoryIndex index.php index.html

當(dāng)在linux環(huán)境下源碼安裝時,大致是這樣:

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

其實原理都是,用LoadModule來加載php5_module,就是把php作為apache的一個子模塊來運行。當(dāng)通過web訪問php文件時,apache就會調(diào)用php5_module來解析php代碼。?

那么,php5_module是如何將數(shù)據(jù)傳給php的解析器來解析php代碼的呢?? ?答案是:sapi

用一張圖來看apache、php、sapi三者之間的關(guān)系:?

從上面圖中,我們看出了sapi就是這樣的一個中間過程,sapi提供了一個和外部通信的接口,使得PHP可以和其他應(yīng)用進(jìn)行交互數(shù)據(jù)(apache,nginx等)。php默認(rèn)提供了很多種sapi,常見的提供給apache和nginx的php5_module、CGI、FastCGI,給IIS的ISAPI,以及Shell的CLI。(httpd是Apache超文本傳輸協(xié)議(HTTP)服務(wù)器的主程序。被設(shè)計為一個獨立運行的后臺進(jìn)程,它會建立一個處理請求的子進(jìn)程或線程池)

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

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

這種模式將php模塊安裝到apache中,每一次apache請求,都會產(chǎn)生一條進(jìn)程,這個進(jìn)程就完整的包括php的各種運算計算等操作。

在上圖中,我們很清晰的可以看到,apache每接收一個請求,都會產(chǎn)生一個進(jìn)程來連接php通過sapi來完成請求,可想而知,如果一旦用戶過多,并發(fā)數(shù)過多,服務(wù)器就會承受不住了。而且,把php當(dāng)做一個模塊加載到apache中,出問題時很難定位是php的問題還是apache的問題。?

2、引出概念

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

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

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

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

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

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

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

(Web Server 一般指Apache、Nginx、IIS、Tomcat等服務(wù)器,Web Application 一般指PHP、Java、Asp.net等應(yīng)用程序)?

二、概念

1、CGI

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

WEB服務(wù)器會傳哪些數(shù)據(jù)給PHP解析器呢?URL、查詢字符串、POST數(shù)據(jù)、HTTP header都會有。所以,CGI就是規(guī)定要傳哪些數(shù)據(jù),以什么樣的格式傳遞給后方處理這個請求的協(xié)議。也就是說,CGI就是專門用來和 web 服務(wù)器打交道的。web服務(wù)器收到用戶請求,就會把請求提交給cgi程序(如php-cgi),cgi程序根據(jù)請求提交的參數(shù)作應(yīng)處理(解析php),然后輸出標(biāo)準(zhǔn)的html語句,返回給web服服務(wù)器,WEB服務(wù)器再返回給客戶端,這就是普通cgi的工作原理。(cgi程序,你就可以理解成遵循cgi協(xié)議編寫的程序)

優(yōu)點:

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

缺點:

但是CGI有個難受的地方,就是每一次web請求都會有啟動和退出過程,也就是最為人詬病的fork-and-execute模式,這樣一在大規(guī)模并發(fā)下,就死翹翹了。?

2、FastCGI

從根本上來說,FastCGI是用來提高CGI程序性能的。類似于CGI,FastCGI也可以說是一種協(xié)議。

FastCGI像是一個常駐(long-live)型的CGI,它可以一直執(zhí)行著,只要激活后,不會每次都要花費時間去fork一次。

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

舉例:

當(dāng)web server收到/index.php請求,看一下CGI程序和FastCGI程序分別是怎么處理的:

CGI:當(dāng)收到web server請求后,會啟動對應(yīng)的CGI程序,這里就是PHP的解析器(php-cgi)。接下來PHP解析器會解析php.ini文件,初始化執(zhí)行環(huán)境,然后處理請求,再以規(guī)定的CGI規(guī)定的格式返回處理后的結(jié)果,退出進(jìn)程。(CGI每次接收到請求都會執(zhí)行這些步驟)

FastCGI:首先,FastCGI程序會先啟動一個master,解析配置環(huán)境,初始化執(zhí)行環(huán)境,然后再啟動多個worker。當(dāng)請求過來時,master會傳遞給一個worker,然后立即可以接受下一個請求。這樣就避免了重復(fù)的勞動,效率自然是高。而且當(dāng)worker不夠用時,master可以根據(jù)配置預(yù)先啟動幾個worker等著;當(dāng)然空閑worker太多時,也會停掉一些,這樣就提高了性能,也節(jié)約了資源,這就是fastcgi對進(jìn)程的管理。(CGI程序和FastCGI程序,可以理解成遵循CGI協(xié)議和FastCGI協(xié)議編寫的程序)

FastCGI的工作原理:

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

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

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

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

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

CGI與FastCGI比較:

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

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

3、PHP-FPM

首先要說的是:fastcgi是一個協(xié)議,php-fpm實現(xiàn)了這個協(xié)議。

大家都知道,PHP的解釋器是php-cgi。php-cgi只是個CGI程序,他自己本身只能解析請求,返回結(jié)果,不會進(jìn)程管理,所以就出現(xiàn)了一些能夠調(diào)度php-cgi進(jìn)程的程序,php-fpm就是這樣的一個東西。它克服了php-cgi變更php.ini配置后,需重啟php-cgi才能讓新的php-ini生效,不可以平滑重啟,直接殺死php-cgi進(jìn)程,php就不能運行了的問題。修改php.ini之后,php-cgi進(jìn)程的確沒辦法平滑重啟的。php-fpm對此的處理機(jī)制是新的worker用新的配置,已經(jīng)存在的worker處理完手上的活就可以歇著了,通過這種機(jī)制來平滑過度。

php-fpm提供了更好的php進(jìn)程管理方式,可以有效的控制內(nèi)存和進(jìn)程,可以平滑重載php配置。

總結(jié)一下這個升級的過程:?

如果要搭建一個高性能的PHP WEB服務(wù)器,目前最佳的方式是Apache/Nginx + FastCGI + PHP-FPM(+PHP-CGI)方式了。?

參考:

? ? ??https://segmentfault.com/a/1190000010968145

??????https://www.awaimai.com/371.html

總結(jié)

以上是生活随笔為你收集整理的cgi web 调用多次启动_全面了解CGI、FastCGI、PHPFPM的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。