問題:
最近要上線一個PHP寫成的MVC項目,發現Windows Server 2008安裝的還是PHP5.2,很多語法不支持。
嘗試的一些解決方案:
1.將PHP升級為5.6,但是需要做好IIS和PHP的配置,因為IIS還承擔了其他幾個Web項目的運行,所以這個方案也是目前最穩妥的辦法。
2.在Windows Server 2008上安裝Apache或者Nginx,因為Apache或者Nginx和PHP搭配更佳,但是Apache在Windows Server 2008上表現不好,另外這個方案還有個缺點是另外需要配置子域名等,之前沒有研究過這方面,所以這個方案備選。
最終解決方案:
1.在安裝PHP5.6之前,先檢查一下是否有Visual C++ 2012運行環境(發行包)。如果沒有,先在微軟下載中心下載安裝。
2.在PHP官網下載PHP5.6,解壓縮到任意盤符任意文件夾,當然,如果你想在IIS配置上“偷個懶”的話,可以把原來PHP文件夾改名為PHP5.2,把PHP5.6改為PHP,來替換原來的路徑。
接下來是一些較為復雜的步驟,請坐穩了,我們要加速了~
3.在php.ini中修改或確保要有以下配置:
cgi.force_redirect = 0
配置的注釋上寫:
cgi.force_redirect is necessary to provide security running PHP as a CGI under most web servers. Left undefined, PHP turns this on by default. You can turn it off here AT YOUR OWN RISK. You CAN safely turn this off for IIS, in fact, you MUST.
其實,本意是希望提供安全的CGI,但是IIS下,你還是必須把TA關了。
cgi.fix_pathinfo=1
配置的注釋上寫:
cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting of zero causes PHP to behave as before. Default is 1. You should fix your scripts to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
這里沒有IIS,所以設置為1即可。
fastcgi.impersonate = 1
配置的注釋上寫:
FastCGI under IIS (on WINNT based OS) supports the ability to impersonate security tokens of the calling client. This allows IIS to define the security context that the request runs under. mod_fastcgi under Apache does not currently support this feature (03/17/2002)
Set to 1 if running under IIS. Default is zero.
這里很感動此處的注釋,把坑都說明清楚了,IIS下,讓你設置為1就應該設置為1。
date.timezone = Asia/Shanghai
時區設置為亞洲上海,但實際上這個配置似乎只作用於你用phpinfo()函數來查看PHP版本,真要用到時區在項目里再寫一句聲明也可以,已親測。
4.在IIS中添加程序映射
這一步其實不難理解,就是讓所有的PHP文件都用CGI來執行,所以把php-cgi.exe這個可執行文件的路徑填寫進去就可以了。
原來在ISAPI限制和CGI限制里有原來PHP5.2的條款,因為PHP5.2和PHP5.6不一樣,5.6版本已經沒有php5isapi.dll這個文件了,也就是說5.6版本已經放棄dll而采用cgi可執行文件,所以可以把這條刪除或者設置為“不允許”。如果要填寫就填寫php-cgi.exe的路徑,記得加引號。
至此,已經可以在瀏覽器中看到這個熟悉的頁面了。
總結:
其實,我們本來要放棄這個方案的,因為中午被一個500狀態碼搞得焦頭爛額,不知道問題出在哪里,后來又出現了php-cgi.exe - FastCGI 進程意外退出和無法定位程序輸入點 php5ts.dll這樣的錯誤,后來我直接運行了php-cgi.exe,發現在命令行中出現的路徑並不是PHP5.6的文件夾路徑,才發現問題。於是我直接把PHP5.6文件夾命名為原來PHP文件夾的名稱,問題順利解決。但問題是沒了,似乎還是遺留下來了一個疑點,究竟少了哪一步?以后如果IIS從零配置PHP,還是會遇到這個問題。