我一直以來都是以 ISAPI 模式運行 PHP 的,這種方式最大的缺點就是穩定性不好,當 PHP 出錯的時候,Apache進程也死掉了。後來看到網上關於 PHP 以 FastCGI 模式運行的介紹,其中提到的種種好處(穩定、安全、高性能)讓我決定嘗試一下。
不過事情遠不如預計的那麼順利。Google 了無數次也沒找到一篇如何在 Windows 下用 Apache + FastCGI 跑 PHP 的資料,IIS + FastCGI 跑 PHP 的倒是不少。其中有一篇提到 Zend 公司也推薦以 FastCGI 模式運行 PHP([url]http://phplens.com/phpeverywhere/fastcgi-php[/url])。
準備工作:
首先訪問 [url]http://www.fastcgi.com/dist/[/url] 下載用於 Apache 的 mod_fastcgi。我使用的是 mod_fastcgi-2.4.2-AP13.dll。下載後將這個文件複製到 Apache 的 modules 目錄中。
首先訪問 [url]http://www.fastcgi.com/dist/[/url] 下載用於 Apache 的 mod_fastcgi。我使用的是 mod_fastcgi-2.4.2-AP13.dll。下載後將這個文件複製到 Apache 的 modules 目錄中。
下載 PHP(我使用的 PHP-5.0.4),並解壓縮,根據需要修改 php.ini 文件。注意不需要從 PHP 所在目錄複製任何文件到 Windows 目錄中。
修改配置:
然後修改 httpd.conf 文件,加入下面幾行:
然後修改 httpd.conf 文件,加入下面幾行:
LoadModule fastcgi_module modules/mod_fastcgi-2.4.2-AP13.dll
ScriptAlias /fcgi-php5/ "d:/usr/local/php-5.0.4/"
FastCgiServer "d:/usr/local/php-5.0.4/php-cgi.exe" -processes 3
# 說明:此處的 -processes 3 表示啓動三個 php-cgi.exe 進程,
# 關於 FastCgiServer 的詳細參數請參考 FastCGI 文檔。
AddType application/x-httpd-fastphp5 .php
Action application/x-httpd-fastphp5 "/fcgi-php5/php-cgi.exe"
# 說明:根據你的 PHP 文件所在位置修改上面兩處黑體字。
ScriptAlias /fcgi-php5/ "d:/usr/local/php-5.0.4/"
FastCgiServer "d:/usr/local/php-5.0.4/php-cgi.exe" -processes 3
# 說明:此處的 -processes 3 表示啓動三個 php-cgi.exe 進程,
# 關於 FastCgiServer 的詳細參數請參考 FastCGI 文檔。
AddType application/x-httpd-fastphp5 .php
Action application/x-httpd-fastphp5 "/fcgi-php5/php-cgi.exe"
# 說明:根據你的 PHP 文件所在位置修改上面兩處黑體字。
修改完成後,重新啓動 Apache 即可。
常見問題:
根據我的多次試驗,最容易出現的幾個問題主要都是由路徑引起的。因此首先檢查 php.ini 和 httpd.conf 文件中的所有路徑是否正確。其次就是如果系統中以前安裝過 PHP,那麼要將 C:\Windows\php.ini 改名或刪除。
根據我的多次試驗,最容易出現的幾個問題主要都是由路徑引起的。因此首先檢查 php.ini 和 httpd.conf 文件中的所有路徑是否正確。其次就是如果系統中以前安裝過 PHP,那麼要將 C:\Windows\php.ini 改名或刪除。
其次還要檢查 PHP 文件所在目錄是否有足夠的權限(我都是設置爲 Everyone - 完全控制,反正開發用機不用考慮那麼多安全限制)。
FastCGI 模式運行 PHP 的優點:
以 FastCGI 模式運行 PHP 有幾個主要的好處。首先就是 PHP 出錯的時候不會搞垮 Apache,只是 PHP 自己的進程當掉(但 FastCGI 會立即重新啓動一個新 PHP 進程來代替當掉的進程)。其次 FastCGI 模式運行 PHP 比 ISAPI 模式性能更好(我本來用 ApacheBench 進行了測試,但忘了保存結果,大家有興趣可以自己測試)。
以 FastCGI 模式運行 PHP 有幾個主要的好處。首先就是 PHP 出錯的時候不會搞垮 Apache,只是 PHP 自己的進程當掉(但 FastCGI 會立即重新啓動一個新 PHP 進程來代替當掉的進程)。其次 FastCGI 模式運行 PHP 比 ISAPI 模式性能更好(我本來用 ApacheBench 進行了測試,但忘了保存結果,大家有興趣可以自己測試)。
最後,就是可以同時運行 PHP5 和 PHP4。參考下面的配置文件,分別建立了兩個虛擬主機,其中一個使用 PHP5,另一個使用 PHP4。
LoadModule fastcgi_module modules/mod_fastcgi-2.4.2-AP13.dll
ScriptAlias /fcgi-php5/ "d:/usr/local/php-5.0.4/"
FastCgiServer "d:/usr/local/php-5.0.4/php-cgi.exe" -processes 3
ScriptAlias /fcgi-php4/ "d:/usr/local/php-4.3.11/"
FastCgiServer "d:/usr/local/php-4.3.11/php.exe"
FastCgiServer "d:/usr/local/php-5.0.4/php-cgi.exe" -processes 3
ScriptAlias /fcgi-php4/ "d:/usr/local/php-4.3.11/"
FastCgiServer "d:/usr/local/php-4.3.11/php.exe"
Listen 80
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot d:/www
Options Indexes FollowSymlinks MultiViews
ServerName php5.localhost
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot d:/www
Options Indexes FollowSymlinks MultiViews
ServerName php5.localhost
AddType application/x-httpd-fastphp5 .php
Action application/x-httpd-fastphp5 "/fcgi-php5/php-cgi.exe"
Action application/x-httpd-fastphp5 "/fcgi-php5/php-cgi.exe"
<Directory "D:/www">
IndexOptions FancyIndexing FoldersFirst
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
IndexOptions FancyIndexing FoldersFirst
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Listen 8080
NameVirtualHost *:8080
NameVirtualHost *:8080
<VirtualHost *:8080>
DocumentRoot d:/www
Options Indexes FollowSymlinks MultiViews
ServerName php4.localhost
DocumentRoot d:/www
Options Indexes FollowSymlinks MultiViews
ServerName php4.localhost
AddType application/x-httpd-fastphp4 .php
Action application/x-httpd-fastphp4 "/fcgi-php4/php.exe"
Action application/x-httpd-fastphp4 "/fcgi-php4/php.exe"
<Directory "D:/www">
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
使用上面的配置,訪問 [url]http://localhost/[/url] 就使用 PHP5,而訪問 [url]http://localhost:8080/[/url] 就使用 PHP4。所以只要合理配置,就可以讓不同的虛擬主機使用不同版本的 PHP。
FastCGI 模式的一些缺點:
說完了好處,也來說說缺點。從我的實際使用來看,用 FastCGI 模式更適合生產環境的服務器。但對於開發用機器來說就不太合適。因爲當使用 Zend Studio 調試程序時,由於 FastCGI 會認爲 PHP 進程超時,從而在頁面返回 500 錯誤。這一點讓人非常惱火,所以我在開發機器上還是換回了 ISAPI 模式。
說完了好處,也來說說缺點。從我的實際使用來看,用 FastCGI 模式更適合生產環境的服務器。但對於開發用機器來說就不太合適。因爲當使用 Zend Studio 調試程序時,由於 FastCGI 會認爲 PHP 進程超時,從而在頁面返回 500 錯誤。這一點讓人非常惱火,所以我在開發機器上還是換回了 ISAPI 模式。
最後,在 Windows 中以 FastCGI 模式存在潛在的安全漏洞。因爲我還沒有找到如何在 Windows 環境下實現 SuEXEC 的方法,因此 PHP 的進程總是以最高權限運行,這從安全角度來看顯然不是個好消息。
結束語:
本文對 FastCGI 的運用還停留在很初級的階段,僅當作拋磚引玉,希望有更成熟的解決方案出現。
本文對 FastCGI 的運用還停留在很初級的階段,僅當作拋磚引玉,希望有更成熟的解決方案出現。