直入正題。
這個環境的部署很有講究,折騰了一天,大概說一下思路:
自從哪個PHP的版本開始(5.2也不知道多少),就分了thread-safe版和non-thread-safe版,簡稱就是ts和nts版本,還區分了VC6和VC編譯的版本,我作一下解釋。(可以參見官方:http://windows.php.net/)
VC6是用在Apache服務器上的,而VC9則適用于IIS,這個比較明確,官方也給了明確說明。
ts和nts版本就比較講究了。這個大家可以參考(http://blog.163.com/daizhen_dz@yeah/blog/static/129411342201042992157604/),我也是從這里學習到的。
IIS添加fastCGI模塊,使其能夠得以運行,再配置fastCGI的配置文件,添加對php-cgi.exe的支持。
結論就是,以fastCGI方式運行PHP會得到性能和資源的平衡。
MVC3的站,大都是通過沒有后綴的方式請求的(controller/action的形式),我的解決方式我認為很合理:在PHP站中什么都不改,而針對.NET 4.0的站,添加對*(所有請求)請求的攔截處理,使用aspnet-isapi來處理請求,這樣既不影響PHP性能(不會先經過aspnet的isapi處理),也不影響.NET站的運行。
環境需要以下資源:
- fastCGI for IIS(微軟官方有下)
- .NET 4.0 Runtime(官方有下)
- PHP 5.3.3(為什么要這個版本,后續會解釋,下載需要從php.net中windows的PHP里,archives中找,http://windows.php.net/downloads/releases/archives/)
- eAccelerator binary for PHP 5.3.3(一開始果斷裝了最新版的5.4.12,但是eAccelerator自己編譯有點麻煩,官方的安裝教程是源碼安裝的,但是服務器上哪來的VS,所以就通過二進制安裝,直接找編譯好的
對于以上環境做一些解釋
- 只要是.NET 4.0,就不需要額外安裝MVC3了,里面自帶了,如果是4.0以下版本,還需要裝MVC
- PHP和eAccelerator的版本是很有講究的。官方的安裝教程(https://github.com/eaccelerator/eaccelerator/wiki)教你的是從源碼安裝,linux下很合理,windows服務器上哪來的VS給你編譯,所以就開始找binary版本(編譯好的DLL)了,渠道可以參考官方的(https://github.com/eaccelerator/eaccelerator/wiki/InstallFromBinary)。
我是從http://www.sitebuddy.com/PHP/Accelerators/eAccelerator_windows_binaries_builds 這里下載的,這個哥們編譯了好多版本的eAccelerator,但是最新的版本也只能支持到PHP 5.3.3。
我嘗試了用5.4.12加載eAccelerator for PHP 5.3.3,結果證明不行,PHP錯誤日志輸出版本不匹配,也嘗試了低版本的PHP,依然不行。因此我還是將PHP降級到5.3.3,運行后成功。
具體安裝步驟比較復雜,我寫個簡明版的。。主要就是些配置方面的東西,關鍵要把原理搞明白。
- PHP下好,放在c:\php里,PHP配置不詳解了,再配個eAccelerator。
- 安裝IIS,記得把ASP.NET勾上
- 打開IIS,添加fastCGI擴展(IIS7默認就帶的,win2003的IIS6得自己配上),不會的話網上搜
- 讓fastCGI支持php cgi擴展。
打開C:\WINDOWS\system32\inetsrv,這是IIS fastCGI的目錄,修改fcgiext.ini文件,末尾添上[Types] php=PHP[PHP] ExePath=C:\PHP\php-cgi.exe InstanceMaxRequests=10000 ActivityTimeout=600 RequestTimeout=600 EnvironmentVars=PHP_FCGI_MAX_REQUESTS:10000,PHPRC:C:\PHP\
- 添加PHP網站,啥都不用配就行了
- 添加.NET網站。選好ASP.NET版本,假設4.0。為了能處理沒有后綴的請求,在”主目錄”里”配置”,”映射”,下面那塊”通配符應用程序映射”,添加一條 “C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll“,然后取消勾選”檢查文件是否存在”。
基本就是這個過程了,這樣就達到了既能跑.NET站,也能跑PHP站的目的了。