天天看點

php安裝模式cgi,fastcgi,php_mod比較

安裝php又面臨到了模式的選擇,以前都是選擇mod_php模式,因為這樣安裝比較友善哈,今天突然關心起FastCGI這種模式,敗毒了一把,找到了一些關于mod_php和Fastcgi的選擇與對比這方面的讨論,現在發出來留一個記号,以便進一步研究:

第一篇:php在apache中安裝模式的差別:fastcgi和mod_php

     說到fastCgi就不得不說Cgi。

     CGI英文全稱是 Common Gateway Interface,通常翻譯為共同網關接口,是HTTP伺服器與機器上的其他程式進行通信的一個接口。這個“其他程式”可以使用任何計算機語言來編寫,它通過CGI這個接口從HTTP伺服器取得輸入,然後把運作的結果又通過CGI這個接口交給HTTP伺服器,而HTTP伺服器把這個結果送給浏覽器。

     CGI的出現讓WEB從靜态變為為動态,随着Web的越來越普及,很多的網站的都需要有動态的頁面,以便與浏覽者互交。CGI方式的缺點也越來越突出。因為HTTP要生成一個動态頁面,系統就必須啟動一個新的程序以運作CGI程式,不斷地fork是一項很消耗時間和資源的工作。這就出現了FastCGI。

   百度百科關于FastCGI

 2. FastCGI 可在任何平台上使用,Netscape Enterprise 及 IIS 都有 FastCGI 的子產品可供使用,阿帕契 (Apache,以及利用 Apache 衍生出做的伺服器) 上也有 mod_fastcgi 可用。

 3. FastCGI 支援 C/C++,Ruby, Perl,Tcl,Java,Python 等程式語言。

 4. FastCGI 的應用程式亦相容于 CGI。即 FastCGI 的應用程式也可以當成 CGI 來執行。

 5. 現有的 CGI 程式要改寫成 FastCGI 非常簡單,最少可能隻需要多加入三行程式代碼。

 6. FastCGI 的偵錯方式與 CGI 大同小異,隻要帶入程式所需的環境變量及參數,即可在指令列模式執行或偵錯。

 7. FastCGI 應用程式的寫作方式與 CGI 類似,除了幾項原則要特别注意外,FastCGI 的寫作方式跟 CGI 幾乎一樣,與學習 Web Server API 比較起來, FastCGI 簡單多了。

 8. FastCGI 支授分布式運算 (distributed computing),即 FastCGI 程式可以在網站伺服器以外的主機上執行并且接受來自其它網站伺服器來的請求。

     mod_php就是把PHP做為APACHE一個内置子產品。讓apache http伺服器本身能夠支援PHP語言,不需要每一個請求就啟動PHP解釋器來解釋PHP。

第二篇:mod_php or fastcgi性能比較與選擇

用php肯定少了不這個問題的選擇,cgi自然就不必說了,但是mod_php和fastcgi的争論确還是比較多的。

找了一些資料,晾在這,可供參考。

首先,性能應該是大家最關心的問題了,除了mod_php和fastcgi 的 benchmark,還有一些伺服器差别的測試,如apache vs lighthttpd

1 mod_php, LightTPD, FastCGI - What’s fastest?

     這個bechmark的結果是 Apache(prefork)+Fastcgi+php的性能是最好的。超過了apache+mod_php,甚至也超過了lightty+fastcgi+php。當然,這個結果得出值相差都很小。另外,以上說的幾個結果都使用了APC加速,使用APC後性能提高1倍以上。

2 php4-mod-vs-cgi

   這個bechmark是在php4的環境下完成的。其summary.txt的内容如下。

------------------------

PHP4 module, very simple script (phpinfo.php): requests/s

plain 130.04

+turckcache 129.42

+turckcache+zend-optimizer 125.50

PHP4 module, very complex script (insurance application): requests/s

plain 1.84

+turckcache 6.23

+turckcache+zend-optimizer 5.58

+optimizer 1.58

PHP4 CGI, very simple script (phpinfo.php): requests/s

plain 22.69

+turckcache n/a*

+turckcache+zend-optimizer n/a*

+optimizer 21.23

PHP4 CGI, very complex script (insurance application): requests/s

plain 2.00

+turckcache n/a*

+turckcache+zend-optimizer n/a*

+optimizer 1.72

* = turkcache doesn't support caching of the PHP scripts in CGI mode

上面的結果我覺得需要關注的是無cache的情況,因為使用mod_php或fastcgi主要還是用來生成動态頁面。前面的cache有更好的工具來實作,如squid。是以,這個結果也是fastcgi勝出,相差也不大。

3 http://buytaert.net/drupal-performance?page=1

   這個文章的結果和上面兩個剛好相反。使用fastcgi代替mod_php後,”When switching from

to

we observe a 63% slowdown for anonymous visitors, and a 18% slowdown for authenticated visitors.”以下是圖表

php安裝模式cgi,fastcgi,php_mod比較

另外,benchmark中也做了和lightty的比較,如下圖:

php安裝模式cgi,fastcgi,php_mod比較

這個文章的結論是Apache+mod_php性能好于Apache+fastcgi。另外,Apache+mod_php略好于lightty+fastcgi。

4 最後看看 fastcgi官方自己怎麼說的吧

    Of course, the answer is that it depends upon the application. A more complete answer is that FastCGI often wins by a significant margin, and seldom loses by very much.

5 結論是,還是根據自己的應用測一下吧….

最後,個人觀點

如果mod_php和fastcgi的性能相差不是很大的話,還是傾向于fastcgi的,這種方式畢竟更靈活、安全和簡單。

1 使用fastcgi,你的web server 可以比較簡單的切換,可以測試不同的伺服器,Apache,lightty,ngix 等等,不需要有代碼的修改

2 如果想換腳本的實作,如不用php,而是改成perl,python之類的,web伺服器也不需要任何的改動

3 web server和fastcgi可以用不同的帳号運作,帶來了一定的安全隔離

4 隻在Apache中編個mod_fastcgi可以說是簡單多了,把mod_php編進apache時,出問題時很難定位是php的問題還是apache的問題,我就見過這樣的core,函數調用幾十層,一點頭緒都沒有

========================================================================================================

先了解一下普通cgi的工作流程:

web server收到使用者請求,并把請求送出給cgi程式,cgi程式根據請求送出的參數作相應處理,然後輸出标準的html語句傳回給web server,web server再傳回給用戶端,這就是普通cgi的工作原理。

從 上面看,cgi所要實作的不過是動态網頁而已,這種處理方式的特點就是每接到一個請求,web server都要fork出一個單獨的cgi程式的程序來處理,這種方式的好處是把web server和具體的程式處理獨立開來,結構清晰,可控性強,同時缺點就是如果在高通路需求的情況下,cgi的程序fork就會成為很大的伺服器負擔,想 象一下數百個并發請求導緻伺服器fork出數百個程序就明白了。這也是為什麼cgi一直背負性能低下,高資源消耗的惡名的原因。

相應的有問題就有解決方案,目前流行的方案就是使用子產品設計,基本上目前的web server都有相應的子產品機制來擴充它的

功能, 隻要按照其設計規範設計出來的子產品,就能插入到web server自身的程序處理,是以性能有很大改觀,例如IIS的isapi,apache的dso。但是,這種方法也不是沒有缺點的,例如對于不同的 web server,要按照不同标準開發,無法做到webserver無關性;例如這将輸入驗證的工作轉交給了web server,沒辦法自由處理;例如一旦出現問題将影響整個web server處理流程;例如插入web server程序導緻的無法以多使用者标示運作,無法處理虛拟主機權限等。

所幸我們還有另外的選擇,這就是fastcgi。 fastcgi是基于cgi架構的擴充,他的核心思想就是在web server和具體cgi程式之間建立一個智能的可持續的中間層,統管cgi程式的運作,這樣web server隻需要将請求送出給這個層,這個層再派生出幾個可複用的cgi程式執行個體,然後再把請求分發給這些執行個體,這些執行個體是可控的,可持續,可複用的, 是以一方面避免了程序反複fork,另一方面又可以通過中間層的控制和探測機制來監視這些執行個體的運作情況,根據不同的狀況fork或者回收執行個體,達到靈活 性和穩定性兼得的目的。

本人曾經做過測試,使用cgi方式運作php效率最差,mod_php方式性能非常不錯,幾乎是cgi方 式的50倍,但是無法保證虛拟主機站點的安全性隔離,而fastcgi性能則基本和mod_php相當,這還是在使用了suexec切換虛拟主機站點運作 使用者的情況下的結果。

fastcgi與cgi的差別

先講下cgi:

cgi在2000年或更早的時候用得比較多, 以前web伺服器一般隻處理靜态的請求,如果碰到一個動态請求怎麼辦呢?web伺服器會把根據這次請求的内容,然後會fork一個新程序運作外部c程式 (或perl腳本...), 這個程序會把處理完的資料傳回給web伺服器,最後web伺服器把内容發送給使用者,剛才fork的程序也随之退出。 如果下次使用者還請求改動态腳本,那麼web伺服器又再次fork一個新程序,周而複始的進行。

後來出現了一種更進階的方式是, web伺服器可以内置perl解釋器或php解釋器。 也就是說這些解釋器做成子產品的方式,web伺服器會在啟動的時候就啟動這些解釋器。 當有新的動态請求進來時,web伺服器就是自己解析這些perl或php腳本,省得重新fork一個程序,效率提高了。

fastcgi的方式是,web伺服器收到一個請求時,他不會重新fork一個程序(因為這個程序在web伺服器啟動時就開啟了,而且不會退 出),web伺服器直接把内容傳遞給這個程序(程序間通信,但fastcgi使用了别的方式,tcp方式通信),這個程序收到請求後進行處理,把結果傳回 給web伺服器,最後自己接着等待下一個請求的到來,而不是退出。 

fastcgi跟cgi的差別是:

                  在web伺服器方面                                                          在對資料進行處理的程序方面 

cgi         fork一個新的程序進行處理                                           讀取參數,處理資料,然後就結束生命期

fastcgi    用tcp方式跟遠端機子上的程序或本地程序建立連接配接       要開啟tcp端口,進入循環,等待資料的到來,處理資料

舉個例子: 服務端現在有個10萬個字單詞, 客戶每次會發來一個字元串,問以這個字元串為字首的單詞有多少個。 那麼可以寫一個程式,這個程式會建一棵trie樹,然後每次使用者請求過來時可以直接到這個trie去查找。 但是如果以cgi的方式的話,這次請求結束後這課trie也就沒了,等下次再啟動該程序時,又要建立一棵trie樹,這樣的效率就太低下了。   而用fastcgi的方式的話,這課trie樹在程序啟動時建立,以後就可以直接在trie樹上查詢指定的字首了。

[問1] 

我也是 c cgi 的堅定支援者,而且親自試驗過 FastCGI 的穩定性和高性能。但是很長時間我也沒查明白:為什麼現在使用 cgi 的網站那麼少,FastCGI 更少了? 

[答1] 

你這個問題問的非常好, 

都知道 CGI 隻是個技術标準(目前使用的是 CGI/1.1), 因為該标準非常簡單所有它很容易用各種進階語言和腳本語言進行描述; 但它也給 CGI 開發者帶來了困難, 那就是過去沒有非常好的開發工具以開發友善開發者開發複雜的應用. 很多時候它們不得不手工 printf 輸入每一句 html 語句. 這樣嚴重限制了傳統 cgi 的發展;

與此同時, 另一批工具(暫時稱之為泛 CGI吧), 如 asp, jsp, php, 它們繼承了 CGI 标準的簡單性, 同時提供了相應的解釋或編譯工具. 通過這些工具, 開發人員隻要在 html/xml 模闆檔案中嵌入相應(腳本)語句即可, 特别是 asp.net 開發環境, php 之後的模闆技術等, jsp 等 strust 架構等都為開發人員提供了更為抽象化的開發工具, 使開發人員徹底忘記了它們(asp, php, jsp等)的前身 CGI (之是以稱它們為泛 CGI, 因為它們都是 CGI 技術的繼承和發展者).

[問3] 

php的性能是因為成了伺服器的子產品,但是 c cgi 也能編寫成子產品的模式,特别是 FastCGI 天生幾乎就是伺服器的子產品,可是為什麼用的人那麼少呢?

而且我自己的試驗證明,FastCGI 極穩定,不穩定基本是程式沒編寫好,有記憶體洩露、忘記重置等問題造成的. 

[答3] 

PHP 也可以作為 CGI 運作, 同時也支援 FastCGI.

php 性能是因為成了伺服器的子產品, 這導緻 php 非常依賴伺服器, 是以通常 php 隻在 apahce 伺服器具有非常好的性能, 換個 webserver 甚至它是不能運作的. 嚴格遵守 CGI 标準的應用工具應該是不存在這些問題的. 

不過, 在适當的應用中, 為了性能犧牲一些特性為是必要的.

對 FastCGI 要有充分的信心, FastCGI 沒有問題, 在很多應用中證明它都有很好的表現.

前面提及, 用的少主要原因是在 CSP/eybuild 之前大家沒有很好的編寫複雜應用的 CGI 開發工具.

[問4] 

實際應用上,多數人會選擇 apache 或 IIS ... 

[答4] 

WEB 服務應用領域是主要用這兩個伺服器, 不過其它 web 應用(如裝置管理/控制等), 使用的 webserver 就很廣泛了, 如 thttpd, mini-httpd, goAhead, lighttpd, boa, ...

它們可能還要運作在不同的 CPU 架構(如 inter, xscale, arm, mips, ...)下, 不同的存儲器限定環境中(如隻有 2M, 8M, 16M的記憶體) 無硬碟, 隻有幾M的 flash 等, 

這些環境的應用中, 目前最主要的 web 開發語言都是 c, ...

[問5] 

我認為随着ajax應用的普及,模闆技術有逐漸被取代的趨勢 

[答5] 

ajax 是一種非常不錯用戶端技術, 通在不重新整理整個頁面的情況下給使用者帶來很新體驗. 它伺服器端的技術互相補充互相依賴, 從目前的形式看, 還很難說誰會取代誰的趨勢. 根據項目和應用不同, 開發者應該靈活選擇它們要選用的開發工具和開發技術, 并進一有效的融合, 不宜單純一味追求某一技術.

[問6] 

web标準用戶端的結構、表現、行為分離,确實是好架構,是發展趨勢,而且能簡化伺服器端開發。我認為随着應用的普及,模闆技術會被取代。那時候,開發服務端隻要程式設計就可以了,完全脫離頁面的束縛。 

[答6] 

呵呵, W3C 關于 結構、表現、行為分離 确實極大地推動了 web 技術的發展, 

但它主要是指結構-(html)、表現(css)、行為(js) 三者的分離, 是一種用戶端技術, 與取代模闆關系不大.

一般認為 ajax 的目标把富用戶端, 弱伺服器, 它可能對 伺服器端的模闆技術有一對沖擊.

1,2 C/C++本身的模闆技術已經足夠了。 論壇裡面我寫過一個模闆能滿足99%的cgi開發

而java的一些架構和技術,是其他産品無法或者難以替代的

3,4 錯誤,php比c cgi更适應各種平台。什麼情況會隻有2m記憶體,硬碟? 也隻能适合嵌入式了

5.6 ajax 技術不能代替任何現有的,對google的盲目崇拜而已。ajax被用在很多不适合的地方, 大多又都帶來加大伺服器消耗的代價

使用FastCGI隻會愈來愈少。

==================================================================================================== 如何在Win7系統配置PHP+MySQL+Apache

确定兩點:
1、下載下傳正确的32位軟體。
2、一步步安裝。

那麼既然是64位的系統我們就必須去照64位的軟體,我可以告訴你,apache 和 php 官網上面的軟體都隻有32位的。Mysql是有64位的。64位的軟體都是牛逼的團隊或者個人自己改編的。首先mysql 64的官網下載下傳位址:http://dev.mysql.com/downloads/mysql/5.1.html
這裡先對這些軟體的格式說一下,一般都隻有兩種格式,一種是msi,另外一種是zip。
Msi格式跟exe檔案差不多,就是點選後安裝的。而zip格式是你解壓以後通過cmd裡面指令進行安裝,然後配置檔案裡需要你自己配置的東西比較多。我搭建的時候apache和php是zip檔案,然後mysql下的是msi檔案。
接下來先去看一下php官網,顯然php官網上沒有我們需要的64位軟體。可它卻提供了64位apache和一些apache子產品的下載下傳位址:
http://www.apachelounge.com/download/win64/
先回到php官網,他有很多版本,vc6,v9,Threadsafe, not Thread safe的。我很多次下錯版本就是因為這些。細心的人可以發現網站的左邊對版本進行了解釋。VC6的版本是用 Visual Studio 6編譯的,這個是八幾年的軟體了,是以現在php 5.3.2以上的版本幾乎都沒有VC6了。可是官網又說:如果你用apache那就要用VC6,IIS的話就用 VC9,而且還強調不要在 apache上用VC9。我估計這句話是很老時候的了,一直沒沒更新。
         我的經驗是:VC6是老版本了,你可以無視它了。是以都用VC9,VC9有兩個版本,一個是線程安全,一個是不安全。如果你apache用的是 fcgid方式運作,那麼就用不安全的,如果你用的是傳統php5apache2_2模式的你就下載下傳安全的。
         下載下傳了VC9 不安全的解壓後裡面是沒有php5apache2_2.dll檔案的,并且應該有php.exe檔案。這個的話apache就必須配置成mod_fcgid方式運作,那麼就必須下載下傳mod_fcgid子產品,下載下傳位址也是:http://www.apachelounge.com/download/win64/
下載下傳之後把mod_fcgid.so檔案複制到apache的moudle檔案夾下,然後再對apache的http.conf進行配置。配置方法我在最後統一寫吧。
         而下載下傳VC9安全的解壓之後是有php5apache2_2.dll檔案的。安裝這種方式運作apache那麼你也不需要去下載下傳mod_fcgid.so了。
         那麼先去上面的網站把64位的apache下載下傳下來,我下的是zip格式的。現在我們缺少的就是64位php了。這個大家自己去網上搜尋吧,因為雖然有兩個網站專門有64位的php,可最近都在維護還是怎麼地,反正不能下載下傳,但在網上都能找到的。比如csdn上就有最新版的php5.4.6 VC9 64位的。
         還有用到兩個輔助軟體,一個是phpmyadmin,另一個是zend optimizer。前者是mysql的輔助工具,後者是加速php程式的。這些大家去找地方下載下傳吧。

安裝Apache 64位
apache-2.2.19-win64.rar解壓到某一目錄,如D:\Apache2.2。
編輯配置檔案D:\Apache2.2\conf\httpd.conf作如下修改
改為 
Listen 80 改為 
Listen 8080# 端口,若已開啟IIS,則80端口就不能使用了
DocumentRoot "/httpd-2.2-x64/htdocs"改為 
DocumentRoot "D:/Apache2.2/htdocs"# 放置網站檔案的路徑
DirectoryIndex index.html改為 
DirectoryIndex index.html index.htm index.php # 加入index.php,PHP的預設頁
ScriptAlias /cgi-bin/ "/httpd-2.2-x64/cgi-bin/"改為
ScriptAlias /cgi-bin/ "D:/Apache2.2/cgi-bin/"
<Directory "/httpd-2.2-x64/htdocs">改為
<Directory "D:/Apache2.2/htdocs">
<Directory "/httpd-2.2-x64/cgi-bin">改為
<Directory "D:/Apache2.2/cgi-bin">
将LoadModule rewrite_module modules/mod_rewrite.so前的#去掉
将include /_httpd/test.conf一行去掉
apache都這樣配置。
3、執行安裝指令:
進入D:\Apache2.2\bin
執行指令:httpd.exe -k install(将apache加入系統服務,預設服務名是Apache2.2)
執行指令:httpd.exe -k start(運作服務)
以後可以使用D:\Apache2.2\bin\ApacheMonitor.exe進行服務的開啟、關閉、重新開機與監控等操作
4、 測試安裝是否成功
打開浏覽器,輸入:http://localhost:8080,顯示 It Works! 說明成功!
 
1. 将下載下傳的php安裝包php-5.3.10-x64.zip解壓到某一路徑下,如D:\PHP
 
2. 修改配置檔案D:\Apache2.2\conf\httpd.conf
在#LoadModule vhost_alias_module modules/mod_vhost_alias.so一行下加上:
LoadModule php5_module "D:/PHP/php5apache2_2.dll"
PHPIniDir "D:/PHP"
 
在AddType application/x-gzip .gz .tgz下加上:
AddType application/x-httpd-php .php
AddType application/x-httpd-php .html # .html, .php為可執行php語言的擴充名
 
3. 将如下檔案複制到C:\Windows\System32下
D:\PHP\php5ts.dll
    D:\PHP\php5isapi.dll
    D:\PHP\php5apache2_2.dll
    D:\PHP\ext\php_mysql.dll
    D:\PHP\ext\php_mysqli.dll
    D:\PHP\libmysql.dll
mod_fcgid方式運作Apache,那麼先将mod_fcgid.so檔案複制到apache下的moudle檔案夾,然後配置httpd.conf:
的存放目錄
設定PHP_FCGI_MAX_REQUESTS大于或等于FcgidMaxRequestsPerProcess,防止php-cgi程序在處理完所有請求前退出
每個程序的最大請求數
最大的程序數
最大執行時間
的路徑
4、之後不管是哪種方式都打開D:\PHP\php.in。如果沒有的話将D:\PHP\php.ini-recommended複制為D:\PHP\php.ini,并作如下修改
修改extension_dir = "./"為
extension_dir = "ext" # 指定動态連接配接庫的目錄
将extension=php_mysql.dll前的分号(注釋)去掉
5. 測試是否安裝成功
修改D:\Apache2.2\htdocs\index.html檔案,加入:<?php echo phpinfo(); ?> 
重新開機httpd服務輸入網址:http://loalhost:8080 ,看到php資訊,說明成功!
為了能自定義安裝位置選擇‘Custom’
選擇安裝路徑,并且點選圖示選擇‘Entire feature willbe install on local hard drive’,能夠點的都選擇這個選項。注意有兩個路徑要填寫,一個是軟體安裝,一個是資料存放路徑。
安裝完了會出現一個配置界面 ‘launch the mysqlconfiguration wizard’對mysql一些參數進行配置。
第一個選擇‘DetailedConfiguraion’,詳細配置。
5、‘DeveloperMachine’‘Dedicated mysql server machine’‘Server Machine’ 選擇MYSQL作為什麼類型運作,一般網站的話都是‘Server Machine’
6、對Mysql速度和存儲量進行選擇,一般選擇中庸的‘MultifunctionDatabase’
7、InnoDBTablespace Settings。這個預設即可。
8、下面設定通路MYSQL的人數,選擇‘ManualSetting’之後自己選擇數字。最大是1400人。根據你的網站實際通路量進行設計即可。
9、‘Enable
TCP/IP Networking’這個必勾選,端口預設3306。‘Add firewall exception for this port’随意。‘Enable Strict
Mode’建議不勾選,嚴格遵守SQL語言。
10、選擇預設字元集,相對常用的是UTF-8。
11、‘Install A是WindowsService’勾選。自動開啟這些都勾選。
12、‘Modify
Security Settings’勾選,設定密碼。‘Enable root access from remote machines’允許在其他電腦上運城連結MYSQL,建議不勾選。‘Create
An Anonymous Account’建立一個普通使用者。
13、最後‘Exexute’完成!
正常情況下這樣就按照完畢了,如果出現失敗的有可能是因為以前的MYSQL沒解除安裝幹淨。
 
D:\Apache2.2\htdocs,可就是網站根目錄,當然你也可以放在其他地方。把檔案夾名字換成 phpMyAdmin,編輯配置檔案D:\Apache2.2\htdocs\libraries\ config.default.php。
配置很簡單,上面那些基本的配置完就能在浏覽器裡輸入 http://localhost/phpmyadmin就能通路了。
zend optimizer安裝就更簡單了,隻要選擇一些php.ini的檔案夾路徑,apache檔案夾的路徑等就可以了。、      
php