本文目錄一覽:
- 1、什麼是CGI,FastCGI,PHP-CGI,PHP-FPM,Spawn-FCGI
- 2、什麼是PHP的CGI模式
- 3、php和cgi之間的區別
- 4、php-cgi報錯,無法啟動
- 5、Win2008 IIS7,無緣無故的FastCGI(php-cgi)佔用過高如下圖,參數調整如下圖:
- 6、關於FastCGI、php-cgi、php-fpm的區別是什麼,各自有什麼用途,以及相互間的關係是什麼?
什麼是CGI,FastCGI,PHP-CGI,PHP-FPM,Spawn-FCGI
什麼是CGI
CGI全稱是「公共網關介面」(Common Gateway Interface),HTTP伺服器與你的或其它機器上的程序進行「交談」的一種工具,其程序須運行在網路伺服器上。
CGI可以用任何一種語言編寫,只要這種語言具有標準輸入、輸出和環境變數。如php,perl,tcl等
什麼是FastCGI
FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行著,只要激活後,不會每次都要花費時間去fork一次(這是CGI最為人詬病的fork-and-execute 模式)。它還支持分散式的運算, 即 FastCGI 程序可以在網站伺服器以外的主機上執行並且接受來自其它網站伺服器來的請求。
FastCGI是語言無關的、可伸縮架構的CGI開放擴展,其主要行為是將CGI解釋器進程保持在內存中並因此獲得較高的性能。眾所周知,CGI解釋器的反覆載入是CGI性能低下的主要原因,如果CGI解釋器保持在內存中並接受FastCGI進程管理器調度,則可以提供良好的性能、伸縮性、Fail- Over特性等等。
FastCGI與CGI特點
1、如CGI,FastCGI也具有語言無關性.
2、如CGI, FastCGI在進程中的應用程序,獨立於核心web伺服器運行,提供了一個比API更安全的環境。(APIs把應用程序的代碼與核心的web伺服器鏈接在一起,這意味著在一個錯誤的API的應用程序可能會損壞其他應用程序或核心伺服器; 惡意的API的應用程序代碼甚至可以竊取另一個應用程序或核心伺服器的密鑰。)
3、FastCGI技術目前支持語言有:C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby等。相關模塊在Apache, ISS, Lighttpd等流行的伺服器上也是可用的。
4、如CGI,FastCGI的不依賴於任何Web伺服器的內部架構,因此即使伺服器技術的變化, FastCGI依然穩定不變。
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在此便退出了。
在上述情況中,你可以想像CGI通常有多慢。每一個Web請求PHP都必須重新解析php.ini、重新載入全部擴展並重初始化全部數據結構。使用FastCGI,所有這些都只在進程啟動時發生一次。一個額外的好處是,持續資料庫連接(Persistent database connection)可以工作。
FastCGI的不足
因為是多進程,所以比CGI多線程消耗更多的伺服器內存,PHP-CGI解釋器每進程消耗7至25兆內存,將這個數字乘以50或100就是很大的內存數。
Nginx 0.8.46+PHP 5.2.14(FastCGI)伺服器在3萬並發連接下,開啟的10個Nginx進程消耗150M內存(15M*10=150M),開啟的64個php-cgi進程消耗1280M內存(20M*64=1280M),加上系統自身消耗的內存,總共消耗不到2GB內存。如果伺服器內存較小,完全可以只開啟25個php-cgi進程,這樣php-cgi消耗的總內存數才500M。
什麼是PHP-CGI
PHP-CGI是PHP自帶的FastCGI管理器。
啟動PHP-CGI,使用如下命令:
1
php-cgi -b 127.0.0.1:9000
PHP-CGI的不足
1、php-cgi變更php.ini配置後需重啟php-cgi才能讓新的php-ini生效,不可以平滑重啟
2、直接殺死php-cgi進程,php就不能運行了。(PHP-FPM和Spawn-FCGI就沒有這個問題,守護進程會平滑從新生成新的子進程。)
什麼是PHP-FPM
PHP-FPM是一個PHP FastCGI管理器,是只用於PHP的,可以在 下載得到.
PHP-FPM其實是PHP源代碼的一個補丁,旨在將FastCGI進程管理整合進PHP包中。必須將它patch到你的PHP源代碼中,在編譯安裝PHP後才可以使用。
現在我們可以在最新的PHP 5.3.2的源碼樹里下載得到直接整合了PHP-FPM的分支,據說下個版本會融合進PHP的主分支去。相對Spawn-FCGI,PHP-FPM在CPU和內存方面的控制都更勝一籌,而且前者很容易崩潰,必須用crontab進行監控,而PHP-FPM則沒有這種煩惱。
PHP5.3.3已經集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP進程管理方式,可以有效控制內存和進程、可以平滑重載PHP配置,比spawn-fcgi具有更多有點,所以被PHP官方收錄了。在./configure的時候帶 –enable-fpm參數即可開啟PHP-FPM。
使用PHP-FPM來控制PHP-CGI的FastCGI進程
1
2
3
4
5
6
7
8
/usr/local/php/sbin/php-fpm{start|stop|quit|restart|reload|logrotate}
–start 啟動php的fastcgi進程
–stop 強制終止php的fastcgi進程
–quit 平滑終止php的fastcgi進程
–restart 重啟php的fastcgi進程
–reload 重新平滑載入php的php.ini
–logrotate 重新啟用log文件
什麼是Spawn-FCGI
Spawn-FCGI是一個通用的FastCGI管理伺服器,它是lighttpd中的一部份,很多人都用Lighttpd的Spawn-FCGI進行FastCGI模式下的管理工作,不過有不少缺點。而PHP-FPM的出現多少緩解了一些問題,但PHP-FPM有個缺點就是要重新編譯,這對於一些已經運行的環境可能有不小的風險(refer),在php 5.3.3中可以直接使用PHP-FPM了。
Spawn-FCGI目前已經獨成為一個項目,更加穩定一些,也給很多Web 站點的配置帶來便利。已經有不少站點將它與nginx搭配來解決動態網頁。
最新的lighttpd也沒有包含這一塊了(),但可以在以前版本中找到它。在lighttpd-1.4.15版本中就包含了()
目前Spawn-FCGI的下載地址是,最新版本是
註:最新的Spawn-FCGI可以到lighttpd.net網站搜索「Spawn-FCGI」找到它的最新版本發布地址
下面我們就可以使用Spawn-FCGI來控制php-CGI的FastCGI進程了
1
/usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u www-data -g www-data -f /usr/bin/php-CGI
參數含義如下:
-f 指定調用FastCGI的進程的執行程序位置,根據系統上所裝的PHP的情況具體設置
-a 綁定到地址addr
-p 綁定到埠port
-s 綁定到unix socket的路徑path
-C 指定產生的FastCGI的進程數,默認為5(僅用於PHP)
-P 指定產生的進程的PID文件路徑
-u和-g FastCGI使用什麼身份(-u 用戶 -g 用戶組)運行,Ubuntu下可以使用www-data,其他的根據情況配置,如nobody、apache等
PHP-FPM與spawn-CGI對比測試
PHP-FPM的使用非常方便,配置都是在PHP-FPM.ini的文件內,而啟動、重啟都可以從php/sbin/PHP-FPM中進行。更方便的是修改php.ini後可以直接使用PHP-FPM reload進行載入,無需殺掉進程就可以完成php.ini的修改載入
結果顯示使用PHP-FPM可以使php有不小的性能提升。PHP-FPM控制的進程cpu回收的速度比較慢,內存分配的很均勻。
Spawn-FCGI控制的進程CPU下降的很快,而內存分配的比較不均勻。有很多進程似乎��分配到,而另外一些卻佔用很高。可能是由於進程任務分配的不均勻導致的.而這也導致了總體響應速度的下降。而PHP-FPM合理的分配,導致總體響應的提到以及任務的平均。
PHP-FPM與Spawn-FCGI功能比較
PHP-FPM、Spawn-FCGI都是守護php-cgi的進程管理器。
什麼是PHP的CGI模式
CGI即通用網關介面(Common Gateway Interface),它是一段程序,通俗的講CGI就象是一座橋,把網頁和Web伺服器中的執行程序連接起來,它把HTML接收的指令傳遞給伺服器的執行程序,再把伺服器執行程序的結果返還給HTML頁。CGI 的跨平台性能極佳,幾乎可以在任何操作系統上實現。
php和cgi之間的區別
cgi是一種介面,不管用什麼語言都可以按照這個介面進行實現。一般伺服器判斷需要調用cgi程序前,會把請求的GET參數放在環境變數QUERY_STRING里,POST請求內容則通過標準輸入流輸送到cgi程序內。cgi程序只需要將HTTP協議(包括HTTP頭和HTTP Body)列印到標準輸出流stdout,伺服器就會把它們直接傳輸給瀏覽器。
舉個栗子:
//c++實現cgi介面,列印query string和post data
#include iostream
using namespace std;
int main() {
cout “Content-type:text/html\n\n”;
const char *queryString = getenv(“QUERY_STRING”);
if (queryString != NULL) {
cout “h1query string is :” queryString “/h1” endl;
} else {
cout “pNo query string/p” endl;
}
string postData, tmpData;
while(cin tmpData) {
postData += tmpData;
}
if (postData != “”) {
cout “div ” postData ” /div” endl;
} else {
cout “pNo post data/p” endl;
}
return 0;
}
把它編譯好,命名為test.cgi,然後扔到伺服器到cgi目錄里。然後訪問類似於;c=d的URL,伺服器就會把a=bc=d放到QUERY_STRING環境變數中傳給test.cgi。最後能看到頁面上顯示出query string is a=bc=d。也可以創建一個表單,把數據POST到,然後可以看到頁面上顯示出所有的POST data。
php是一種腳本語言,它可以用來做很多事。。。比如說用來寫CGI程序:
#!/usr/env php
?php
echo “Content-type:text/html\n\n”;
$queryString = $_ENV(“QUERY_STRING”);
if ($queryString != NULL) {
echo “h1query string is : $queryString/h1”;
} else {
echo “pNo query string/p”;
}
$postData = file_get_contents(“php://stdin”);
if ($postData != “”) {
echo “div $postData /div”;
} else {
echo “pNo post data/p”;
}
?
好吧它的功能跟上面C++寫的程序一毛一樣,我們把它加上「可執行屬性」chmod +x testphp.cgi然後扔到cgi目錄,然後訪問;c=d,以及用表單post數據給它,看到的效果應該是一樣的。
所以你也看到了,伺服器調用CGI程序,它才不管你用啥實現的,反正介面都定好了,只要按介面來編程就行。
但一般伺服器調用PHP和調用CGI程序的邏輯不一樣。CGI程序需要自己解析QUERY_STRING和POST_DATA,PHP應該是通過另一套擴展跟伺服器交互的,所以一般用PHP直接寫網頁的時候,寫網頁的方式跟平時還真不太一樣,比如說,伺服器的php擴展已經幫我們把query string和post data解析成了數組,我們直接取值就好了:
?php
if (isset($_GET)) {
print_r($_GET);
} else {
echo “pNo query string/p”;
}
if (isset($_POST)) {
print_r($_POST);
} else {
echo “pNo post data/p”;
}
?
存成test.php之後訪問;c=d,或者表單提交內容到頁面。可以看到輸出的數據都是結構化的,已經變成數組了。而且,HTTP頭也不需要我們自己輸出了(特殊情況除外)。
php-cgi報錯,無法啟動
你這個命令:
c:\program files (x86)\PHPphp-cgi.exe -b localhost:9000 -c c:\program files (x86)\PHP\php.ini
是不可以的,因為裡面的參數文件名中有空格,可以考慮使用引號試試看,例如:
c:\program files (x86)\PHPphp-cgi.exe -b localhost:9000 -c “c:\program files (x86)\PHP\php.ini”
否則,可以考慮重新安裝,按照到其它簡單的文件夾裡面,例如C:\PHP5.2.14\
Win2008 IIS7,無緣無故的FastCGI(php-cgi)佔用過高如下圖,參數調整如下圖:
方法/步驟
1、首先安裝IIS 7,下載PHP Manager(請百度搜索下載,坑爹的不允許發鏈接),請根據自己的系統選擇32位或者64位下載。安裝步驟就不截圖了,一路按next就好了。安裝完後在IIS管理器裡面就能看到PHP Manager了。
2、下載php5.3以上版本。在選擇版本時有
3、Thread Safe和Non Thread Safe之分。Non Thread Safe就是非線程安全,Thread Safe 是線程安全。在windows+IIS平台選擇Non Thread Safe版本的PHP,並選擇V9以上的版本。本文以64位V11 Non Thread Safe 5.5.14版本為例:
4、解壓PHP 5.5壓縮包到某個文件夾中(本文以D:\PHPweb\PHP),打開IIS管理器,雙擊「PHP Manager」:
5、點擊「Register New PHP Version」,在彈出框裡面選擇PHP目錄下的php-cgi.exe文件,點擊確認後就能看到PHP的相關信息:
6、重啟IIS,PHP運行環境就配置成功了。出現「FastCGI進程意外退出」如何解決?在DOS下輸入命令「D:\PHPweb\PHP\php.exe -v」,根據提示做相應的修改即可。小編在運行命令後提示「缺失msvcp110.dll」,在36X衛士中「人工服務」直接修復了。
關於FastCGI、php-cgi、php-fpm的區別是什麼,各自有什麼用途,以及相互間的關係是什麼?
fastcgi是一個通用網關介面,用於web伺服器(iis, apache)和應用程序通信。
php-cgi是php平台的cgi程序
以上兩個結合,可以使php整合在web服務中
php-fpm是一個獨立的php-fcgi管理軟體,它要整合進web服務中,需要使用代理模式
一般與nginx搭配。也可以與apache搭配
php-fpm一般不直接作為服務容器提供外網訪問,而是通過常用web容器作代理
php作為伺服器端的解析程序,運行模式分很多種,fastcgi, mod_php, proxy(代理)等。
與iis搭配時一般採用fast-cgi模式,iis自帶fast-cgi引擎,配置好php參數即可
與apache搭配,在windows平台下,一般也是fast-cgi模式,在linux系統中一般是mod_php模式,把php作為一個子模塊載入
也可以配置php-fpm 然後在apache中配置代理模式
與nginx搭配,一般就是用php-fpm+代理模式了
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/236971.html