我这里说的php多版本共存不仅仅是php4、php5两个大版本号程序的共存,而是php的很多小版本号程序的共存,例如php4.3.1、php4.4.5、php5.2.0、php5.2.9等等,不仅如此,由于测试的需求,我还需要做到php的版本可以随时灵活切换。

目前网上很多的解决方案是在本机安装IIS和Apache或安装多个apache服务,每个服务器安装一个版本的php来达到版本共存的要求,但是要按照我的要求,这么做既麻烦又复杂(想想要调试10个版本的php怎么办)。既然网上没有,我就只好自己来研究,下面就是我摸索出的完美解决方案:

实现思路:Apache + .htaccess + PHP CGI
众所周知,php cgi的配置代码如下

ScriptAlias /php/ “D:/WebService/php-5.2.8-Win32/”
AddType application/x-httpd-php .php
Action application/x-httpd-php “/php/php-cgi.exe”

ScriptAlias的解释

映射一个URL到文件系统并视之为CGI脚本

The ScriptAlias directive has the same behavior as the Alias directive, except that in addition it marks the target directory as containing CGI scripts that will be processed by mod_cgi’s cgi-script handler. URLs with a case-sensitive (%-decoded) path beginning with URL-path will be mapped to scripts beginning with the second argument, which is a full pathname in the local filesystem.

Alias指令使文档可以被存储在DocumentRoot以外的本地文件系统中。以(%已解码的)url-path路径开头的URL可以被映射到以directory-path开头的本地文件

那这里,我们就可以从ScriptAlias下手,来映射不同版本php文件夹

在httpd.conf文件中我们可以这样写

ScriptAlias /php5.2.8/ “D:/WebService/php-5.2.8-Win32/”
ScriptAlias /php5.2.7/ “D:/WebService/php-5.2.7-Win32/”
ScriptAlias /php5.2.0/ “D:/WebService/php-5.2.0-Win32/”
ScriptAlias /php4.3.1/ “D:/WebService/php-4.3.1-Win32/”
ScriptAlias /php4.4.6/ “D:/WebService/php-4.4.6-Win32/”

这样我们就映射了许多的虚拟脚本路径,如果我们需要使用某个版本的php 就可以修改 Action application/x-httpd-php 的虚拟路径来实现了。

例如,我们想使用4.3.1版本的php,修改Action application/x-httpd-php为

Action application/x-httpd-php “/php4.3.1/php.exe”

但是直接把配置代码写在配置文件中,每次修改PHP版本都要重启Apache才可以,而且每次只能使用一个版本的PHP,使用起来还是非常的不方便。
这个时候我想到了apache的.htaccess文件,在Apache里面.htaccess文件提供了针对每个目录改变配置的方法,可以让同一个服务器下不同目录使用不同的配置方案。
我们在服务器目录下放置一个.htaccess文件,内容写上
Action application/x-httpd-php “/php5.2.8/php-cgi.exe”
那么当前目录Apache就会采用php5.2.8来解析php程序
同理,我们在服务器上为每一个版本的php建立一个文件夹或者虚拟主机,然后在目录中放置一个设定好php版本的.htaccess文件即可实现同一服务器运行不同版本php程序。

下面是配置步骤

1、下载自己需要版本的php程序文件,配置好每个版本php的php.ini文件,将它们放在各自文件夹的根目录即可。
然后把这些文件统一的放置在一个文件夹里(放哪其实无所谓,你找得到就行),由于我们配置的php是以cgi形式运行的,所以我们不需要拷贝任何文件到系统目录下面。
然后在Apache的配置文件中按照以下格式填写,有几个版本就写几行
ScriptAlias /php版本号/ “php版本程序文件绝对物理路径”
例如:
ScriptAlias /php5.2.8/ “D:/WebService/php-5.2.8-Win32/”
ScriptAlias /php5.2.7/ “D:/WebService/php-5.2.7-Win32/”
ScriptAlias /php5.2.0/ “D:/WebService/php-5.2.0-Win32/”
ScriptAlias /php4.3.1/ “D:/WebService/php-4.3.1-Win32/”
ScriptAlias /php4.4.6/ “D:/WebService/php-4.4.6-Win32/”

写完之后,再增加以下代码
AddType application/x-httpd-php .php

2、为了.htaccess文件起作用,我们需要在httpd.conf中找到 <Directory /> </Directory> 节点将里面的 AllowOverride 属性修改为 AllowOverride All.
这样设置后apache下所有的文件目录默认情况下就会支持.htaccess的配置了。
如果你的网站目录有使用<Directory 路径/> </Directory>标签来单独设置,请自行查找该目录的 AllowOverride 属性设置并修改。
设定完毕后请重启Apache服务。

3.到你想指定php版本的网站目录中放置一个.htaccess文件,在文件中写入以下代码
如果是php4,需要这么写
Action application/x-httpd-php “/php版本号/php.exe”
如果是php5,需要这么写
Action application/x-httpd-php “/php版本号/php-cgi.exe”
例如,我需要php4.3.1来解析,那么就这么写
Action application/x-httpd-php “/php4.3.1/php.exe”

写一个phpinfo看看当前版本,然后可以尝试修改.htaccess中php的版本映射路径后刷新页面,怎么样,版本信息立马变化,不需要再次重启apache了

点击查看原图