php的幾種運行模式CLI、CGI、FastCGI、mod_php


php的幾種運行模式CLI、CGI、FastCGI、mod_php

一、總結

一句話總結:

PHP能不能成功的在Apache服務器上運行,就看我們如何去配置PHP的運行方式。PHP運行目前為止主要有三種方式:

mod_php、以模塊加載的方式運行,初學者可能不容易理解,其實就是將PHP集成到Apache服務器,以同一個進程運行。

CGI、以CGI的方式運行,CGI英文叫做公共網關接口,就是Apache在遇到PHP腳本的時候會將PHP程序提交給CGI應用程序(php-cgi.exe)解釋,解釋之后的結果返回給Apache,然后再返回給相應的請求用戶。

FastCGI、以FastCGI的方式運行。這種形式是CGI的加強版本,CGI是單進程,多線程的運行方式,程序執行完成之后就會銷毀,所以每次都需要加載配置和環境變量fork-and-execute(創建-執行)。而FastCGI則不同,FastCGI 像是一個常駐 (long-live) 型的 CGI,它可以一直執行着,只要激活后,不會每次都要花費時間去 fork 一次。FastCGI進程管理器自身初始化,啟動多個CGI解釋器進程 (在任務管理器中可見多個php-cgi.exe)並等待來自Web Server的連接。

 

1、php的CLI運行模式是什么?

命令行

CLI:就是命令行,例如可以在控制台或者是shell中鍵入命令:

php -f index.php

然后獲取輸出

 

命令行界面(英語: command-line interface縮寫CLI)是在 圖形用戶界面得到普及之前使用最為廣泛的 用戶界面,它通常不支持 鼠標,用戶通過鍵盤輸入指令,計算機接收到指令后,予以執行。也有人稱之為 字符用戶界面CUI)。
通常認為,命令行界面(CLI)沒有 圖形用戶界面GUI)那么方便用戶操作。因為,命令行界面的軟件通常需要用戶記憶操作的命令,但是,由於其本身的特點,命令行界面要較圖形用戶界面節約計算機系統的資源。在熟記命令的前提下,使用命令行界面往往要較使用圖形用戶界面的操作速度要快。所以,圖形用戶界面的操作系統中,都保留着可選的命令行界面。

 

2、php中的CGI運行模式是什么?

公共網關接口

以CGI的方式運行,CGI英文叫做公共網關接口,就是Apache在遇到PHP腳本的時候會將PHP程序提交給CGI應用程序(php-cgi.exe)解釋,解釋之后的結果返回給Apache,然后再返回給相應的請求用戶。

CGI 是Web 服務器運行時外部程序的規范,按CGI 編寫的程序可以擴展服務器功能。CGI 應用程序能與瀏覽器進行交互,還可通過數據庫API 與數據庫服務器等外部數據源進行通信,從數據庫服務器中獲取數據。格式化為HTML文檔后,發送給瀏覽器,也可以將從瀏覽器獲得的數據放到數據庫中。幾乎所有服務器都支持CGI,可用任何語言編寫CGI,包括流行的C、C ++、VB 和Delphi 等。CGI 分為標准CGI 和間接CGI兩種。標准CGI 使用命令行參數或環境變量表示服務器的詳細請求,服務器與瀏覽器通信采用標准輸入輸出方式。間接CGI 又稱緩沖CGI,在CGI 程序和CGI 接口之間插入一個緩沖程序,緩沖程序與CGI 接口間用標准輸入輸出進行通信。

    公共網關接口”(Common Gateway Interface),HTTP服務器 與你的或其它機器上的程序 進行 “交談”的一種工具 ,其程序 須運行在網絡 服務器 上。在服務器 環境中,為“程序 ”提供標准 的接口,通過這個接口,“程序 ”可以對服務器 與客戶端 交換的信息 做一些事情 。“程序 ”的語 言並沒有要求。程序 對接口進行 操作。服務器 要支持 CGI就要提供CGI中要求的環境變量 ,或者還有別的。

個人理解:CGI規定了php與web server交流的規則,相當於執行了response = exec("php -f index.php -url=xxx -cookie=xxx -xxx=xxx")。

 

3、php的運行模式FastCGI是什么?

以FastCGI的方式運行。這種形式是CGI的加強版本,CGI是單進程,多線程的運行方式,程序執行完成之后就會銷毀,所以每次都需要加載配置和環境變量fork-and-execute(創建-執行)。而FastCGI則不同,FastCGI 像是一個常駐 (long-live) 型的 CGI,它可以一直執行着,只要激活后,不會每次都要花費時間去 fork 一次。FastCGI進程管理器自身初始化,啟動多個CGI解釋器進程 (在任務管理器中可見多個php-cgi.exe)並等待來自Web Server的連接。

 

4、php的運行模式mod_php是什么?

模塊加載

以模塊加載的方式運行,初學者可能不容易理解,其實就是將PHP集成到Apache服務器,以同一個進程運行。

 

5、php中常見的幾種運行模式?

PHP能不能成功的在Apache服務器上運行,就看我們如何去配置PHP的運行方式。PHP運行目前為止主要有三種方式:

a、以模塊加載的方式運行,初學者可能不容易理解,其實就是將PHP集成到Apache服務器,以同一個進程運行。

b、以CGI的方式運行,CGI英文叫做公共網關接口,就是Apache在遇到PHP腳本的時候會將PHP程序提交給CGI應用程序(php-cgi.exe)解釋,解釋之后的結果返回給Apache,然后再返回給相應的請求用戶。

c、以FastCGI的方式運行。這種形式是CGI的加強版本,CGI是單進程,多線程的運行方式,程序執行完成之后就會銷毀,所以每次都需要加載配置和環境變量fork-and-execute(創建-執行)。而FastCGI則不同,FastCGI 像是一個常駐 (long-live) 型的 CGI,它可以一直執行着,只要激活后,不會每次都要花費時間去 fork 一次。FastCGI進程管理器自身初始化,啟動多個CGI解釋器進程 (在任務管理器中可見多個php-cgi.exe)並等待來自Web Server的連接。

 

6、php的cgi運行模式如何配置 ?

cgi的方式運行,需要做如下的配置php配置文件

cgi.force_redirect = 0 //本來是 1 並且去掉注釋符號;

修改apache的配置,去掉原來的模塊配置

AddType application/x-httpd-php .php
LoadModule php5_module "C:/php5/php5apache2_2.dll"
PHPinidir "C:/php5/php.ini"

 

7、cgi是什么?

最早的Web服務器簡單地響應瀏覽器發來的HTTP請求,並將存儲在服務器上的HTML文件返回給瀏覽器,也就是靜態html。事物總是不 斷發展,網站也越來越復雜,所以出現動態技術。但是服務器並不能直接運行 php,asp這樣的文件,自己不能做,外包給別人吧,但是要與第三做個約定,我給你什么,然后你給我什么,就是握把請求參數發送給你,然后我接收你的處 理結果給客戶端。那這個約定就是 common gateway interface,簡稱cgi。這個協議可以用vb,c,php,python 來實現。cgi只是接口協議,根本不是什么語言。下面圖可以看到流程  

 

 

 8、cgi和fastcgi是什么?

  CGI工作原理:每當客戶請求CGI的時候,WEB服務器就請求操作系統生成一個新的CGI解釋器進程(如php-cgi.exe),CGI 的一個進程則處理完一個請求后退出,下一個請求來時再創建新進程。當然,這樣在訪問量很少沒有並發的情況也行。可是當訪問量增大,並發存在,這種方式就不 適合了。於是就有了fastcgi。

  FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行着,只要激活后,不會每次都要花費時間去fork一次(這是CGI最為人詬病的fork-and-execute 模式)。

 

 

二、php的幾種運行模式CLI、CGI、FastCGI、mod_php

1、CLI:就是命令行,例如可以在控制台或者是shell中鍵入命令:

php -f index.php

然后獲取輸出

 

2、CGI:以下是不同的說法與理解

    公共網關接口”(Common Gateway Interface),HTTP服務器 與你的或其它機器上的程序 進行 “交談”的一種工具 ,其程序 須運行在網絡 服務器 上。在服務器 環境中,為“程序 ”提供標准 的接口,通過這個接口,“程序 ”可以對服務器 與客戶端 交換的信息 做一些事情 。“程序 ”的語 言並沒有要求。程序 對接口進行 操作。服務器 要支持 CGI就要提供CGI中要求的環境變量 ,或者還有別的。

    HTTP Server和一個獨立的進程之間的協議,把HTTP Request的Header設置成進程的環境變量,HTTP Request的正文設置成進程的標准輸入,而進程的標准輸出就是HTTP Response包括Header和正文。

    這個 Web 服務器使用了 UNIX shell 環境變量 來保存從 Web 服務器傳遞出去的參數,然后生成一個運行 CGI 的獨立進程

    不同類型語言寫的程序只要符合cgi標准,就能作為一個cgi程序與web服務器交互

    以CGI方式運行時,web server將用戶請求以消息的方式轉交給PHP獨立進程,PHP與web服務之間無從屬關系。

 

    個人理解:CGI規定了php與web server交流的規則,相當於執行了response = exec("php -f index.php -url=xxx -cookie=xxx -xxx=xxx")。

 

    關於CGI與CLI區別可以查看官方文檔說的挺不錯的:http://php.net/manual/zh/features.commandline.php

    文中闡述了CGI與CLI的顯著區別:

        以下為 CLI SAPI 和其它 CLI SAPI 模塊相比的顯著區別:

  • 與 CGI SAPI 不同,其輸出沒有任何頭信息。

    盡管 CGI SAPI 提供了取消 HTTP 頭信息的方法,但在 CLI SAPI 中並不存在類似的方法以開啟 HTTP 頭信息的輸出。

    CLI 默認以安靜模式開始,但為了保證兼容性,-q 和 --no-header 參數為了向后兼容仍然保留,使得可以使用舊的 CGI 腳本。

    在運行時,不會把工作目錄改為腳本的當前目錄(可以使用 -C 和 --no-chdir 參數來兼容 CGI 模式)。

    出錯時輸出純文本的錯誤信息(非 HTML 格式)。

 

3、FastCGI:CGI有很多缺點,每接收一個請求就要fork一個進程處理,只能接收一個請求作出一個響應。請求結束后該進程就會結束。而FastCGI會事先啟動起來,作為一個cgi的管理服務器存在,預先啟動一系列的子進程來等待處理,然后等待web服務器發過來的請求,一旦接受到請求就交由子進程處理,這樣由於不需要在接受到請求后啟動cgi,會快很多。FastCGI使用進程/線程池來處理一連串的請求。這些進程/線程由FastCGI服務器管理,而不是Web服務器。 當進來一個請求時,Web服務器把環境變量和這個頁面請求通過一個Socket長連接傳遞給FastCGI進程。FastCGI像是一個常駐型的CGI,它可以一直執行,在請求到達時不會花費時間去fork一個進程來處理(這是CGI對位人詬病的fork-and-execute模式)。正是因為它只是一個通信協議,它還支持分布式的運算,即FastCGI程序可以在網站服務器以外的主機上執行並且接受來自其他網站服務器的請求

    FastCGI整個流程:

    1. Web server啟動時載入FastCGI進程管理器

    2. FastCGI自身初始化,啟動多個CGI解釋器進程(可見多個php-cgi)並等待來自Web server的請求

    3. 當請求Web server時,Web server通過socket請求FastCGI進程管理器,FastCGI進程管理器選擇並連接到一個CGI解釋器,Web server將CGI環境變量和標准輸入發送到FastCGI子進程php-cgi

    4. FastCGI子進程處理請求完成后將標准輸出和錯誤從同一連接返回給Web server,當FastCGI子進程結束后請求便結束。FastCGI子進程接着等待處理來自FastCGI進程管理器的下一個連接,在CGI模式中,php-cgi在此便退出了。

 

    php-fpm:PHP的FastCGI進程管理器

 

4、mod_php:即apache的php模塊,將PHP做為web-server的子進程控制,兩者之間有從屬關系.最明顯的例子就是在CGI模式下,如果修改了PHP.INI的配置文件,不用重啟web服務便可生效,而模塊模式下則需要重啟web服務。以mod_php模式運行PHP,意味着php是作為apache的一個模塊來啟動的,因此只有在apache啟動的時候會讀取php.ini配置文件並加載擴展模塊,在apache運行期間是不會再去讀取和加載擴展模塊的

Apache的工作模式 prefork的工作原理

一個單獨的控制進程(父進程)負責產生子進程,這些子進程用於監聽請求並作出應答。Apache總是試圖保持一些備用的 (spare)或是空閑的子進程用於迎接即將到來的請求。這樣客戶端就無需在得到服務前等候子進程的產生。在Unix系統中,父進程通常以root身份運行以便邦定80端口,而 Apache產生的子進程通常以一個低特權的用戶運行。User和Group指令用於配置子進程的低特權用戶。運行子進程的用戶必須要對他所服務的內容有讀取的權限,但是對服務內容之外的其他資源必須擁有盡可能少的權限。

worker的工作原理

每個進程能夠擁有的線程數量是固定的。服務器會根據負載情況增加或減少進程數量。一個單獨的控制進程(父進程)負責子進程的建立。每個子進程能夠建立ThreadsPerChild數量的服務線程和一個監聽線程,該監聽線程監聽接入請求並將其傳遞給服務線程處理和應答。Apache總是試圖維持一個備用(spare)或是空閑的服務線程池。這樣,客戶端無須等待新線程或新進程的建立即可得到處理。在Unix中,為了能夠綁定80端口,父進程一般都是以root身份啟動,隨后,Apache以較低權限的用戶建立子進程和線程。User和Group指令用於配置Apache子進程的權限。雖然子進程必須對其提供的內容擁有讀權限,但應該盡可能給予他較少的特權。另外,除非使用了suexec ,否則,這些指令配置的權限將被CGI腳本所繼承

 

    個人理解:這種模式把php嵌入到apache中,相當於給apache加入了解析php文件的功能。

 

參考:php的幾種運行模式CLI、CGI、FastCGI、mod_php - orlion - 博客園
http://www.cnblogs.com/orlion/p/5282753.html

 

 

三、Windows下圖文詳解PHP三種運行方式(php_mod、cgi、fastcgi)

PHP能不能成功的在Apache服務器上運行,就看我們如何去配置PHP的運行方式。PHP運行目前為止主要有三種方式:

a、以模塊加載的方式運行,初學者可能不容易理解,其實就是將PHP集成到Apache服務器,以同一個進程運行

b、以CGI的方式運行,CGI英文叫做公共網關接口,就是Apache在遇到PHP腳本的時候會將PHP程序提交給CGI應用程序(php-cgi.exe)解釋,解釋之后的結果返回給Apache,然后再返回給相應的請求用戶

c、以FastCGI的方式運行。這種形式是CGI的加強版本,CGI是單進程,多線程的運行方式,程序執行完成之后就會銷毀,所以每次都需要加載配置和環境變量fork-and-execute(創建-執行)。而FastCGI則不同,FastCGI 像是一個常駐 (long-live) 型的 CGI,它可以一直執行着,只要激活后,不會每次都要花費時間去 fork 一次。FastCGI進程管理器自身初始化,啟動多個CGI解釋器進程 (在任務管理器中可見多個php-cgi.exe)並等待來自Web Server的連接。下面我就分別配置這

三種運行方式:

1、無論上述哪種方式運行,下面的配置通常都會加上,解壓PHP安裝包到c:/PHP5/,重命名PHP.ini-recommend文件為PHP.ini,分別尋找如下字段編輯,去除前面的分號(注意不要去錯分號,好多是注釋信息,仔細辨認)。

error_reporting = E_ALL //開啟報錯,便於程序員查錯 line 342
display_errors = On //顯示錯誤 line 373
extension_dir = "C:/php5/ext" //php的擴展選項文件所在的目錄 line 542
date.timezone = Asia/shanhai //時區配置  line 716

2、以模塊的方式運行,在Apache(C:/Program Files/Apache Software Foundation/Apache2.2/conf)的配置文件里添加如下配置

LoadModule php5_module "C:/php5/php5apache2_2.dll" //大約line 127
PHPinidir "C:/php5/php.ini"
//修改配置
DirectoryIndex index.html index.php//追加index.php
AddType application/x-httpd-php .php //line 408左右添加

接着我們在apache的根目錄下面,默認C:/Program Files/Apache Software Foundation/Apache2.2/htdocs新建php文件index.php,編輯添加如下代碼:

 
 
 
         

然后我們在地址欄輸入http://localhost/會出現如下界面:注意紅色部分和配置的關系

3、cgi的方式運行,需要做如下的配置php配置文件

cgi.force_redirect = 0 //本來是 1 並且去掉注釋符號;

修改apache的配置,去掉原來的模塊配置

AddType application/x-httpd-php .php
LoadModule php5_module "C:/php5/php5apache2_2.dll"
PHPinidir "C:/php5/php.ini"

=>加入以下配置

AddHandler cgi-script .cgi // line 396

然后我們在目錄C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin新建一個cgi文件test.cgi編寫如下代碼:

#!c:/php5/php-cgi.exe
<?
php php phpinfo();
?>

最后我們訪問http://localhost/cgi-bin/test.cgi,出現如下結果則說明配置成功了:

如果同時打開多個則會有很多php-cgi.exe,並且在執行完成之后消失:

4、PHP的fastcig方式運行,首先需要去下載fastcgi模塊,默認是沒有帶這個模塊的,而cgi是自帶的;下載地址http://httpd.apache.org/mod_fcgid/;解壓復制其中的mod_fcgid.so和mod_fcgid.pdb,接下來做如下的配置:

LoadModule fcgid_module modules/mod_fcgid.so // line 128追加
FcgidInitialEnv PHPRC "c:/php5" //php配置文件 line 129追加
AddHandler fcgid-script .php //添加句柄 即后綴 什么樣的文件需要fastcgi解釋 line 407追加
FcgidWrapper "c:/php5/php-cgi.exe" .php //解釋器路徑 line 408
Options Indexes FollowSymLinks ExecCGI //line 221 追加 ExecCGI 意思是目錄允許執行CGI腳本

是否成功安裝,只需要做個PHP文件檢查就可以了,我們就用上面的index.php文件:

終於把PHP的運行方式講完了,初學者一定要親自試驗一下,這篇教程具有一定的難度,要反復思考才能理解其中的意思,涉及到一些專業知識,當然你暫時可以直接使用模塊運行方式,等自己對PHP有了一定的理解之后可以再回頭看看這篇文章,今天我花了幾個小時的時間整理PHP的運行方式,由於作者本人的水平有限,錯誤之處在所難免!

參考:Windows下圖文詳解PHP三種運行方式(php_mod、cgi、fastcgi) - 52php - 博客園
https://www.cnblogs.com/52php/p/5668823.html

 

 

四、CGI與FastCGI

當我們在談到cgi的時候,我們在討論什么

  
  最早的Web服務器簡單地響應瀏覽器發來的HTTP請求,並將存儲在服務器上的HTML文件返回給瀏覽器,也就是靜態html。事物總是不 斷發展,網站也越來越復雜,所以出現動態技術。但是服務器並不能直接運行 php,asp這樣的文件,自己不能做,外包給別人吧,但是要與第三做個約定,我給你什么,然后你給我什么,就是握把請求參數發送給你,然后我接收你的處 理結果給客戶端。那這個約定就是 common gateway interface,簡稱cgi。這個協議可以用vb,c,php,python 來實現。cgi只是接口協議,根本不是什么語言。下面圖可以看到流程                        

 

  WEB服務器與cgi程序交互

   WEB服務器將根據CGI程序的類型決定數據向CGI程序的傳送方式,一般來講是通過標准輸入/輸出流和環境變量來與CGI程序間傳遞數據。 如下圖所示:

  CGI程序通過標准輸入(STDIN)和標准輸出(STDOUT)來進行輸入輸出。此外CGI程序還通過環境變量來得到輸入,操作系統提供了許 多環境變量,它們定義了程序的執行環境,應用程序可以存取它們。Web服務器和CGI接口又另外設置了一些環境變量,用來向CGI程序傳遞一些重要的參 數。CGI的GET方法還通過環境變量QUERY-STRING向CGI程序傳遞Form中的數據。 下面是一些常用的CGI環境變量:

變量名 描述
CONTENT_TYPE 這個環境變量的值指示所傳遞來的信息的MIME類型。目前,環境變量CONTENT_TYPE一般都是:application/x-www-form-urlencoded,他表示數據來自於HTML表單。
CONTENT_LENGTH 如果服務器與CGI程序信息的傳遞方式是POST,這個環境變量即使從標准輸入STDIN中可以讀到的有效數據的字節數。這個環境變量在讀取所輸入的數據時必須使用。
HTTP_COOKIE 客戶機內的 COOKIE 內容。
HTTP_USER_AGENT 提供包含了版本數或其他專有數據的客戶瀏覽器信息。
PATH_INFO 這個環境變量的值表示緊接在CGI程序名之后的其他路徑信息。它常常作為CGI程序的參數出現。
QUERY_STRING 如果服務器與CGI程序信息的傳遞方式是GET,這個環境變量的值即使所傳遞的信息。這個信息經跟在CGI程序名的后面,兩者中間用一個問號'?'分隔。
REMOTE_ADDR 這個環境變量的值是發送請求的客戶機的IP地址,例如上面的192.168.1.67。這個值總是存在的。而且它是Web客戶機需要提供給Web服務器的唯一標識,可以在CGI程序中用它來區分不同的Web客戶機。
REMOTE_HOST 這個環境變量的值包含發送CGI請求的客戶機的主機名。如果不支持你想查詢,則無需定義此環境變量。
REQUEST_METHOD 提供腳本被調用的方法。對於使用 HTTP/1.0 協議的腳本,僅 GET 和 POST 有意義。
SCRIPT_FILENAME CGI腳本的完整路徑
SCRIPT_NAME CGI腳本的的名稱
SERVER_NAME 這是你的 WEB 服務器的主機名、別名或IP地址。
SERVER_SOFTWARE 這個環境變量的值包含了調用CGI程序的HTTP服務器的名稱和版本號。例如,上面的值為Apache/2.2.14(Unix)

 

  一個例子

  說了這么多,你也許感覺煩了,寫個小程序可能會更好的理解。 lighttpd + CGI,用c語言寫cgi程序 。

      lighttpd 配置 cgi, 打開cgi.conf, cgi.assign = (".cgi" => "") 設置 cgi 模塊的擴展名和解釋器。就本語句而言,表示cgi模塊的擴展名是“.cgi”且該 cgi 模塊不需要特別的解釋器來執行。因為用c來寫的是可執行文件。

     下面是 test.c 代碼:

#include "stdio.h" #include "stdlib.h" #include <string.h> int mian() { char *data; data = getenv("QUERY_STRING"); puts(data); printf("Hello cgi!"); return 0; }

 生成可執行文件放到你的服務器配置程序的目錄下

gcc test.c -o test.cgi

 訪問:http://localhost/test.cgi?a=b&c=d 結果為: 

a=b&c=d
Hello cgi!

  通過環境變量"QUERY_STRING" 獲取get 方式提交的內容,如果想獲取post 提交的內容可以通過getenv("CONTENT-LENGTH"),Web服務器在調用使用POST方法的CGI程序時設置此環境變量,它的文本值表示Web服務器傳送給CGI程序的輸入中的字符數目。上面例子展示了cgi 程序與web服務器的交互。

  cgi 與 fastcgi

  CGI工作原理:每當客戶請求CGI的時候,WEB服務器就請求操作系統生成一個新的CGI解釋器進程(如php-cgi.exe),CGI 的一個進程則處理完一個請求后退出,下一個請求來時再創建新進程。當然,這樣在訪問量很少沒有並發的情況也行。可是當訪問量增大,並發存在,這種方式就不 適合了。於是就有了fastcgi。

  FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行着,只要激活后,不會每次都要花費時間去fork一次(這是CGI最為人詬病的fork-and-execute 模式)。

  一般情況下,FastCGI的整個工作流程是這樣的:

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

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

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

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

        PHP-FPM與Spawn-FCGI

  Spawn-FCGI是一個通用的FastCGI管理服務器,它是lighttpd中的一部份,很多人都用Lighttpd的Spawn-FCGI進行FastCGI模式下的管理工作。 但是有缺點,於是PHP-fpm就是針對於PHP的,Fastcgi的一種實現,他負責管理一個進程池,來處理來自Web服務器的請求。目前,PHP-fpm是內置於PHP的。

  apache 模塊方式

  記得曾在xp 配置 apache + php ,會在apache 配置下面一段:

LoadModule php5_module C:/php/php5apache2_2.dll

  當PHP需要在Apache服務器下運行時,一般來說,它可以模塊的形式集成, 此時模塊的作用是接收Apache傳遞過來的PHP文件請求,並處理這些請求, 然后將處理后的結果返回給Apache。如果我們在Apache啟動前在其配置文件中配置好了PHP模塊, PHP模塊通過注冊apache2的ap_hook_post_config掛鈎,在Apache啟動的時候啟動此模塊以接受PHP文件的請求。

     Apache 的Hook機制是指:Apache 允許模塊(包括內部模塊和外部模塊,例如mod_php5.so,mod_perl.so等)將自定義的函數注入到請求處理循環中。 換句話說,模塊可以在Apache的任何一個處理階段中掛接(Hook)上自己的處理函數,從而參與Apache的請求處理過程。 mod_php5.so/ php5apache2.dll就是將所包含的自定義函數,通過Hook機制注入到Apache中,在Apache處理流程的各個階段負責處理php請 求。

有人測試nginx+PHP-FPM在高並發情況下可能會達到Apache+mod_php55~10倍,現在nginx+PHP-FPM使用的人越來越多

參考: CGI與FastCGI - wanghetao - 博客園
https://www.cnblogs.com/wanghetao/p/3934350.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM