由于做前端开发及部分 php的工作,因此经常要使用不同的 php版本环境软件,这就面临一个问题,因为普通的配置情况下,你只能同时使用一个php版本的环境。像常见的 php5.3.x,或php5.6.x,或php7.0.x系列,你并不能让它们同时工作和随时随地切换成你需要的版本,因为那样要涉及修改文件和重启你的电脑,并配置相应的环境变量才能实现。
下面有一部分方法可以实现多个版本的php同时运行并随时切换它们,这是我自己找到的方法,因为在 2008年时就面临过这类问题,当时的机房多台服务器,因为有多个(大约 3000左右)虚拟网站在上面运行,就一台服务器,由于配置了 iis6.0,它可不像现在的 iis7.0 or 7.5 or 8.0 or 8.5这么容易实现多个版本的php同时存在,那是一种怎样的实现方式,我至今还有部分问题未曾解决,那时候也没有 php5.3 5.6 或 7.0这样的版本。但就是在那种落后的条件下,偶也通过配置多个 httpd.ini和 isapi去强行实现了多版本的php同时运行和随时切换,虽然有麻烦,要改好几处地方,过去的已经不存在了,放眼未来,在这个时代各种技术和配置已经发展了起来,今天我就通过一部分规则和配置方式实现很多人想做到却未能成功完成的事情。
这里有几个前提条件,你必须在 web.config规则之前完成它们。
1、vc++(运行库)
安装 php在 windows环境下运行的必要 vc++组件库,
1 2 3 | 2015 x64 2012 x64 x86 2010sp1 x86 或 msvcr71.dll |
直接访问php-cgi.exe,根据报错提示安装相应vc++版本。
1 2 3 4 5 | 2015 vc_redist.x64.exe 2012 vc_redist.x64.exe vc_redist.x86.exe vcredist_arm.exe 2010sp1 vcredist_x86.exe or msvcr71.dll |
2、php(服务器软件)
下载你需要的 php不同版本
1 2 3 4 5 6 7 8 9 10 11 12 13 | php-5.2.x-nts-Win32-VC6-x86 php-5.3.x-nts-Win32-VC9-x86 php-5.4.x-nts-Win32-VC9-x86 php-5.5.x-nts-Win32-VC11-x64 php-5.6.x-Win32-VC11-x86 php-5.6.x-nts-Win32-VC11-x64 php-7.0.x-nts-Win32-VC14-x64(Alpha 1) |
以上是不同的 php版本,注意其中有 nts 和普通安全线程的不同版本。这个在一些 zend加密组件的情况下需要使用,例如 cmstop ecshop这类加密过的代码的运行。当然我不是说 ecshop原版会加密,这里只是说部分模板及作者的版本,他们通常会加密自己的 php文件或绑定域名,这时候就需要它来运行和处理,因为 php5.5之后的 nts版本是无法使用 zend加密组件的,请记住这点,很多人弄不清楚它们如何去配置并成功看到那个 zend loader标志。如果需要请下载它们,ZendGuardLoader-php-5.3-Windows 和zend-loader-php5.6-windows-x86。
1 2 3 4 5 6 | [Zend Guard Loader] zend_extension="C:\Program Files (x86)\PHP\ext\ZendLoader.dll" zend_loader.enable=1 zend_loader.disable_licensing=0 zend_loader.obfuscation_level_support=3 zend_loader.license_path= |
这些 php软件分别安装在 C:\Program Files (x86)\PHP5.3.x_x86,要能够正常运行服务,一般测试是直接双击它目录下面的 php-cgi.exe 和 php.exe这类主程序文件,米有报错就证明它可以正常运行,你的环境 vc++库已经正确安装。请记住不要像过去或网上常见教程文章里面说的方法,什么将 php.ini复制到 windows\system32\目录下面 这种及其重复的工作,因为 php根本不需要那样做。这里面还是有一些具体 php.ini配置的,这个偶就不再说明,因为版本太多要说的就离开主题(重点)太远,走到另外一个大的无限循环 (for ... each ... in and for ... each ... xxx? and for ... crazy!) 里面了 :) 总之你想办法让你的 php环境能够运行起来。
1 2 3 4 5 6 7 8 9 10 11 | C:\Program Files\PHP5.6.x_x64 C:\Program Files\PHP7.0.x_x64 C:\Program Files (x86)\PHP5.3.x_x86 C:\Program Files (x86)\PHP5.4.x_x86 C:\Program Files (x86)\PHP5.5.x_x86 C:\Program Files (x86)\PHP5.6.x_x86 |
这是 php软件的安装位置,要和下面的环境变量及 web.config规则保持一致,否则可能导致你的 php环境无法运行。
3、environment(环境变量)
1 2 3 4 5 6 7 8 9 10 11 12 13 | //系统属性 - 高级 - 环境变量 系统变量 Path C:\Program Files\PHP\;C:\Program Files (x86)\PHP\; C:\Program Files\PHP7.0.x_x64\;C:\Program Files\PHP5.6.x_x64\;C:\Program Files (x86)\PHP5.6.x_x86\;C:\Program Files (x86)\PHP5.5.x_x86\;C:\Program Files (x86)\PHP5.4.x_x86\;C:\Program Files (x86)\PHP5.3.x_x86\; PHPRC(此项多版本下面不要保留,直接删除留空就可以) C:\Program Files (x86)\PHP\ C:\Program Files\PHP7.0.x_x64\;C:\Program Files\PHP5.6.x_x64\;C:\Program Files (x86)\PHP5.6.x_x86\;C:\Program Files (x86)\PHP5.5.x_x86\;C:\Program Files (x86)\PHP5.4.x_x86\;C:\Program Files (x86)\PHP5.3.x_x86\; C:\Program Files\iis express\PHP\v7.0;C:\Program Files\PHP7.0.x_x64\;C:\Program Files\PHP5.6.x_x64\;C:\Program Files (x86)\PHP5.6.x_x86\;C:\Program Files (x86)\PHP5.4.x_x86\;C:\Program Files (x86)\PHP5.3.x_x86\;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\Microsoft\Web Platform Installer\; %SystemDrive%\inetpub\wwwroot我 |
偶在运行多版本的 php同时,还安装了微软那个 webplatform平台(C:\Program Files\iis express\PHP\v7.0;,Path里面可以加这个让它同时运行),它也可以运行多个版本的 php,挺方便的,不过偶还是喜欢自己编写的规则和命名。大概这样效率会更好些。
4、iis管理器 – 处理程序映射 – 添加模块映射
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 添加模块映射 //请求路径 *.php //模块 FastCgiModule //可执行路径 "C:\Program Files\PHP\php-cgi.exe" //名称 PHP_via_FastCGI PHP_via_FastCGI_5.2.x_x86 PHP_via_FastCGI_5.3.x_x86 PHP_via_FastCGI_5.4.x_x86 PHP_via_FastCGI_5.5.x_x86 PHP_via_FastCGI_5.6.x_x86 PHP_via_FastCGI_5.6.x_x64 PHP_via_FastCGI_7.0.x_x64 |
这些是偶空间和本地使用的 php版本号,如果你不需要乃至这么多的 php不同版本,请删除其中不需要的,这个要和下一步骤的 web.config保持一致,否则会导致部分问题也许会报错和无法运行它们。偶以前同时运行过大约 200个不同的 php版本,而且一个站点下面的不同目录运行了不同的版本,这相当复杂,呵呵。你不需要去理解和配置同样的事情。
添加映射时要注意一下,它会提示自动添加至 fastcgi设置服务里面,点是就可以。如果点否,请自己在 fastcgi设置模块里面手动添加配置,这个就不详细描述,因为太简单的事情偶不想一一地重复和解释。这里只做主题(重点)相关的解说。
5、rewrite组件
rewrite_x64_zh-CN.msi 或 rewrite_x86_zh-CN.msi,或者另外一对 rewrite_2.0_rtw_x64.msi 或 rewrite_2.0_rtw_x86.msi。
这个米什么要说的,除了语言版本 rewrite_x64_zh-TW.msi,就不需要再做任何配置工作,直接安装运行就可以了。
6、web.config规则(多个php版本)
1 2 3 4 5 6 7 8 9 10 11 12 | <!-- BEGIN handlers --> <handlers> <remove name="PHP_via_FastCGI_5.2.x_x86" /> <remove name="PHP_via_FastCGI_5.3.x_x86" /> <remove name="PHP_via_FastCGI_5.4.x_x86" /> <remove name="PHP_via_FastCGI_5.5.x_x86" /> <remove name="PHP_via_FastCGI_5.6.x_x86" /> <remove name="PHP_via_FastCGI_5.6.x_x64" /> <remove name="PHP_via_FastCGI_7.0.x_x64" /> <add name="PHP_via_FastCGI_7.0.x_x64" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="C:\Program Files\PHP7.0.x_x64\php-cgi.exe" resourceType="File" requireAccess="None" /> </handlers> <!-- END handlers --> |
其实也很好理解的,就是当环境变量写入了相应的不同 php版本名称,并且你的目录下面有这些实际的 php服务器软件,那么规则就可以写成以上内容。
7、打开 iis管理器的节点锁定
如果报错:
不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定
在全新安装的IIS7下搭建网站,访问页面时出现错误信息如下:
配置错误 不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(overrideModeDefault=”Deny”),或者是通过包含 overrideMode=”Deny” 或旧有的 allowOverride=”false” 的位置标记明确设置的。
需要运行命令:
win键 + f + x + a(运行超级管理员cmd)(路径 C:\Windows\System32\cmd.exe 右键以管理员身份运行)
1 2 3 | %windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers %windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/modules |
这是最后一步,再米有要说的了,全部完成。
这里还是贴一下自己的 web.config规则,以免部分人员把顺序和节点弄错了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | <?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <!-- BEGIN modules --> <modules> <!-- remove Helicontech APE --> <remove name="Helicon.Ape" /> <!-- Add Uri- File- and Token cache modules --> <!-- for IIS Output Cache --> <add name="UriCacheModule" /> <add name="FileCacheModule" /> <add name="TokenCacheModule" /> </modules> <!-- END modules --> <!-- BEGIN handlers --> <handlers> <!-- Remove the existing PHP fastCgi handler, so we can add our own --> <remove name="PHP_via_FastCGI_5.2.x_x86" /> <remove name="PHP_via_FastCGI_5.3.x_x86" /> <remove name="PHP_via_FastCGI_5.4.x_x86" /> <remove name="PHP_via_FastCGI_5.5.x_x86" /> <remove name="PHP_via_FastCGI_5.6.x_x86" /> <remove name="PHP_via_FastCGI_5.6.x_x64" /> <remove name="PHP_via_FastCGI_7.0.x_x64" /> <!-- My PHP7 WinCache PHP handler in IIS, the scriptProcessor path is specific to my environment. Due to a file system cache bug in WinCache v1.3.7.4 for PHP 5.6, I'm running PHP 7/WinCache. See @ www.saotn.org/php-wincache-on-iis/ for more PHP WinCache configuration information --> <add name="PHP_via_FastCGI_7.0.x_x64" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="C:\Program Files\PHP7.0.x_x64\php-cgi.exe" resourceType="File" allowPathInfo="true" requireAccess="Script" /> <!-- flush invalid solution set responseBufferLimit="0",but will affect the ajax no refresh effect,become the page blank refresh effect. --> <!-- remove Perl (.cgi, .pl) if unused --> <remove name="Perl-CGI" /> <!-- remove Perl (.isapi, .pl) if unused --> <remove name="Perl-ISAPI" /> <!-- remove Perl (.cgi, .pl) if unused --> <remove name="PerlPLX" /> <!-- remove PHP3 (.php3) if unused --> <remove name="PHP3" /> <!-- remove PHP4 (.php4) if unused --> <remove name="PHP4" /> <!-- remove ISAPI_RewriteProxy 64-bit if unused --> <remove name="ISAPI_RewriteProxy-64" /> <!-- remove ISAPI_RewriteProxy if unused --> <remove name="ISAPI_RewriteProxy" /> <!-- remove PHP (.php) if unused --> <remove name="PHP" /> </handlers> <!-- END handlers --> </system.webServer> </configuration> |
如果你看完这篇文章教程能够自己配置成功多版本 php环境的话,那么恭喜!你已经全部掌握了多版本 php的要领。
偶最近时间已经不够用,所以再不编写这类的教程,希望大家能够理解,当然还是要说一句话,下次依然有教程出来,也许不一定是偶完全编写的,但一定是不错的教程,因为它不会就此(停止)打住。