問題:php
最近要上線一個PHP寫成的MVC項目,發現Windows Server 2008安裝的仍是PHP5.2,不少語法不支持。web
嘗試的一些解決方案:redis
1.將PHP升級爲5.6,可是須要作好IIS和PHP的配置,由於IIS還承擔了其餘幾個Web項目的運行,因此這個方案也是目前最穩妥的辦法。api
2.在Windows Server 2008上安裝Apache或者Nginx,由於Apache或者Nginx和PHP搭配更佳,可是Apache在Windows Server 2008上表現很差,另外這個方案還有個缺點是另外須要配置子域名等,以前沒有研究過這方面,因此這個方案備選。瀏覽器
最終解決方案:安全
1.在安裝PHP5.6以前,先檢查一下是否有Visual C++ 2012運行環境(發行包)。若是沒有,先在微軟下載中心下載安裝。bash
2.在PHP官網下載PHP5.6,解壓縮到任意盤符任意文件夾,固然,若是你想在IIS配置上「偷個懶」的話,能夠把原來PHP文件夾更名爲PHP5.2,把PHP5.6改成PHP,來替換原來的路徑。函數
接下來是一些較爲複雜的步驟,請坐穩了,咱們要加速了~this
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,仍是會遇到這個問題。