在XAMPP中有没有使用两个不同版本的PHP的方法?

281

我们正在使用XAMPP和PHP 7.0,因为我们的新产品需要PHP 7。

但是,有些旧项目使用了像mysql_connect等函数,这些在PHP 7.0中已经被删除。

那么,在XAMPP中是否有一种简单的方法可以更改PHP版本?

注意:请不要建议将旧项目升级以与新版本兼容,因为我无法做出此类开发人员不得作为决策的决定(只是一名员工)。


我认为除了升级,你想要做的事情没有其他解决方法。此外,你不应该寻找使旧的和已弃用的API兼容的方法。它们应该被完全删除。显然这是很多工作,但这将确保安心。 - Rotimi
1
我在MAMP中切换PHP版本时,会关闭和启动Apache。虽然很麻烦,但这样做有效。 - Scott C Wilson
你可以创建虚拟主机,然后为每个主机指定 PHP 版本。 - Aref Ben Lazrek
3
@IlmariKaronen,我希望在您的开发工作站上切换它们。简单地说,当我在做项目A时,我想使用PHP 5,当我在做项目B时,我想使用PHP 7。即使是最高评分的答案也不起作用,我找不到...许多用户也有同样的问题。 - I am the Most Stupid Person
1
顺便提一下,我希望您知道使用 mysql_ 命令存在 SQL 注入的风险。请改用 PDO 或 mysqli_。更多信息请参见 https://www.sitepoint.com/migrate-from-the-mysql-extension-to-pdo/。 - gthuo
显示剩余7条评论
24个回答

325

为什么要在不同的PHP版本之间切换,如果您可以在同一个xampp安装中使用多个PHP版本呢?

只需使用一个xampp安装即可选择以下4种选项:

  1. 仅为旧项目目录运行较旧的PHP版本:这通常就足够了。您可能有一两个旧项目需要使用较旧的PHP版本来运行。只需配置xampp,只为那些项目目录运行较旧的PHP版本即可。

  2. 在xampp的另一个端口上运行旧版PHP: 有时您可能会将旧项目升级到最新的PHP版本,同时您需要在新旧PHP版本之间来回运行同一项目。为此,您可以在不同的端口(比如8056)上设置较旧的PHP版本,因此当您访问 http://localhost /any_project/ 时,xampp运行PHP 7,而当您访问http://localhost:8056/any_project/ 时,xampp运行PHP 5.6。

  3. 在虚拟主机上运行较旧的PHP版本: 可以创建一个名为localhost56的虚拟主机来运行PHP 5.6,同时您可以在localhost上使用PHP 7。

设置步骤

步骤1:下载PHP

您已在xampp下运行PHP 7,现在想要添加一个较旧的PHP版本(比如PHP 5.6)。从php.net (旧版本请查看存档)下载NTS(非线程安全)版本的PHP zip文件并将文件提取到 c:\xampp\php56 下。 线程安全版本不包括php-cgi.exe。

步骤2:配置php.ini

在记事本中打开文件c:\xampp\php56\php.ini 。如果该文件不存在,则将php.ini-development复制到php.ini并在记事本中打开它。然后取消注释以下行:

extension_dir = "ext"

如果在Apache配置文件httpd-xampp.conf中存在下面这行代码:

SetEnv PHPRC "\\path\\to\\xampp\\php"

使用前导#(井号)将其注释掉。

步骤3:配置apache

打开xampp控制面板,点击apache的配置按钮,并点击Apache (httpd-xampp.conf)。一个文本文件将会打开。在文件底部添加以下设置:

ScriptAlias /php56 "C:/xampp/php56"
Action application/x-httpd-php56-cgi /php56/php-cgi.exe
<Directory "C:/xampp/php56">
    AllowOverride None
    Options None
    Require all denied
    <Files "php-cgi.exe">
        Require all granted
    </Files>
</Directory>

Note: 如果您需要,可以按照步骤1到3添加更多版本的PHP到您的Xampp安装中。

Step 4 (option 1): [添加目录以运行特定版本的PHP]

现在,您可以设置要在PHP 5.6中运行的目录。只需将以下内容添加到配置文件的底部(来自步骤3的httpd-xampp.conf),即可设置目录。

<Directory "C:\xampp\htdocs\my_old_project1">
    <FilesMatch "\.php$">
        SetHandler application/x-httpd-php56-cgi
    </FilesMatch>
</Directory>

<Directory "C:\xampp\htdocs\my_old_project2">
    <FilesMatch "\.php$">
        SetHandler application/x-httpd-php56-cgi
    </FilesMatch>
</Directory>

步骤 4 (选项 2): [在不同端口上运行旧版 PHP]

现在要将 PHP v5.6 设置到端口 8056 上,请在配置文件底部 (httpd-xampp.conf,来自步骤 3) 添加以下代码。

Listen 8056
<VirtualHost *:8056>
    <FilesMatch "\.php$">
        SetHandler application/x-httpd-php56-cgi
    </FilesMatch>
</VirtualHost>

第四步(选项3):[在虚拟主机上运行旧版本的PHP]

为了在http://localhost56上使用PHP v5.6,在目标位置创建名为htdocs56的目录,并创建名为localhost56的虚拟主机,然后将其添加到hosts文件中(查看方法),最后在配置文件(httpd-xampp.conf,来自第三步)的底部添加以下代码。

<VirtualHost localhost56:80>
    DocumentRoot "C:\xampp\htdocs56"
    ServerName localhost56
    <Directory "C:\xampp\htdocs56">
        Require all granted    
    </Directory>
    <FilesMatch "\.php$">
        SetHandler application/x-httpd-php56-cgi
    </FilesMatch>
</VirtualHost>

完成:保存并重新启动Apache

保存并关闭配置文件。从xampp控制面板重新启动Apache。如果您选择了选项2,则可以在xampp控制面板中看到额外的端口(8056)。

xampp控制面板显示已配置端口运行的apache


13
你好,我尝试了这种方法(第4步选项1),但出现了错误“来自脚本'php-cgi.exe'的格式错误标题:不良标题:<br />”。你有什么想法是什么问题呢? - Priyanshu
1
在@MunimMunna更新了上面的帖子后,这现在对我起作用了。如建议所述,我不得不注释掉SetEnv PHPRC行以停止畸形错误通知。特别感谢Munim在使这个工作方面提供的杰出帮助。 - Leon
4
答案中不再包含包含SetEnv PHPRC的代码,我无法将其注释掉,但我仍然遇到了那个错误。:( - Brett
6
你好。当我运行localhost:8056时,出现“找不到对象”页面。 - nas
2
有人能够使用xdebug同时运行多个php版本吗?我收到了以下错误信息:Error message: End of script output before headers: php-cgi.exe - Noman
显示剩余47条评论

99
您可以下载所需的PHP版本并将它们放置在自己的目录中,例如: c:\php5\ c:\php7\ 您只需要告诉您的Web服务器(Apache)使用哪个版本的PHP,方法是加载适当的模块。在Apache中,您可以通过找到文件httpd.conf并编辑相应的行来实现此目的: LoadModule php7_module c:\php7\libphp7.so 当然,您必须找出正确的路径-这仅供说明。
保存httpd.conf并重新启动服务器。请注意,如果您不重新启动它,则更改将不会生效。
没有GUI开关可以执行此操作,您需要编辑.conf文件,然后重新启动Apache。 这只需要几秒钟,您甚至可以注释掉一个版本,因此“切换”只需要几个按键,例如: 使用PHP 5:
LoadModule php5_module c:\php5\libphp5.so
#LoadModule php7_module c:\php7\libphp7.so

使用 PHP 7:

#LoadModule php5_module c:\php5\libphp5.so
LoadModule php7_module c:\php7\libphp7.so
您不需要多个XAMPP版本,也不需要双重启动或使用另一台机器,或者任何其他“解决方案”,这些方案都提出了复杂的变通方法。原帖作者想要使用XAMPP并告诉它要使用哪个版本的PHP。这是最快捷、最有效的方法,只需要一个XAMPP安装即可。

编辑-2017年11月1日: 显然有人说在Windows上没有.so文件。我所给出的答案是从我在我的Mac上设置的方式调整的(它使用.so文件而不是.dll)。但是,答案的原则仍然完全正确。您正在使用Apache的配置文件httpd.conf来指定PHP模块(.so.dll)在您的系统上的位置。因此,在Windows上唯一的区别可能是文件名和/或路径位置。我所给出的答案对于纯净的Apache/PHP安装(完全没有XAMPP)也是正确的。


2
我认为你的答案是最好的,我将会接受它。但是我在httpd/conf中找不到类似于“LoadModule php7_module c:\php7\libphp7.so”的行。 - I am the Most Stupid Person
3
我重新检查过了,但没有找到它。你能否请帮我检查一下httpd.conf文件?这是它的副本链接:http://freetexthost.com/sjxz4lh1i5 如果你找到需要修改的那一行,请告诉我。 - I am the Most Stupid Person
2
@IamtheMostStupidPerson 显然这不是一个简单的一行代码,而是需要进行多行替换。这个网站非常详细:https://silas.com.ng/multiple-php-version-xampp-windows/ - IMB
26
在v3.2.2中,这行代码位于xampp/apache/conf/extra/httpd-xampp.conf文件中。 - Manuel
5
不仅仅是一行代码,你需要编辑 httpd-xampp.conf 中的很多部分。因此,最好每次需要时都切换整个 httpd-xampp.conf 文件。 - Jeffz
显示剩余12条评论

49

你可以像我一样下载并安装两个不同版本的XAMPP:(一个是php7,另一个是php5)下载链接 图片描述

如果你不想这么做,我建议你使用WAMP并按照这里的说明更改版本。


8
你为什么要这样做?你只是因为 PHP 的一个微小差异(版本不同),就再次安装了很多相同的软件(例如 Apache 和 MySQL 完全相同)。我已经发布了一个解决方案,让你可以仅使用一个 XAMPP 安装,并将其指向适当的 PHP 版本。 - Andy
31
你为什么要这样做?因为这有效,而且如果这样做可以节省时间,我也不介意安装多个 Apache 和 MySQL。 - Maulik
36
不需要担心最佳实践,这是一个本地环境。 - Ricardo Vigatti
2
我使用这种方法,并建议您为每个安装添加特定的开始菜单条目,比如:例如C:\ProgramData\Microsoft\Windows\Start Menu\Programs\XAMPP56和C:\ProgramData\Microsoft\Windows\Start Menu\Programs\XAMPP7。 - Ricardo Vigatti
6
如果这不是一个好的解决方案,为什么不发表一个正确的解决方案呢?实际上,在同一个xampp上安装两个版本非常困难,而这里的所有解决方案都是错误的... - Federico Schiocchet

13

我建议使用Docker,这样可以将环境拆分为各种组件,并随时混合和匹配所需的组件。

Docker将允许您运行一个带有MySQL的容器,另一个带有PHP的容器。由于它们是单独的镜像,因此您可以拥有两个容器,一个是PHP 5,另一个是PHP 7,您可以启动任何一个并且端口80可以映射到两个容器。

https://hub.docker.com上有各种预配置的镜像,您可以轻松安装和运行。

我还添加了portainer作为一个镜像,它允许您从docker镜像中管理各个方面 - (我在启动时启动了该容器,以便节省使用命令行的时间)。它不能为您做所有事情,有时从命令行配置和启动镜像更容易,但一旦设置好,您就可以通过Web界面启动和停止它们。

也可以同时运行两个容器并将不同的端口映射到每个端口。因此,端口80可以映射到PHP 5,端口81可以映射到PHP 7(如果您在2017年观看此视频,则映射到PHP 8.1)。

有各种教程介绍如何安装Docker(https://docs.docker.com/engine/installation/)以及其他类似的'how to'内容。尝试http://www.masterzendframework.com/docker-development-environment/获取开发环境配置信息。


我完全赞同。为了让你的公司受益,请运行Docker。切换PHP版本,更快地接纳新开发人员,使部署变得更加容易,并且在生产过程中不会出现任何意外。 - Kris Peeling
“将81转换为PHP 81。”你是指PHP 7吗?我认为我们离PHP 81还有一段距离 :) - Andy
2
额...我真正的意思是81(我正在确保我的答案是未来兼容的 :-/) - Nigel Ren
2
@NigelRen 我没有给它投反对票,但我猜测可能是因为你提出了一个完全不同的解决方案(Docker),而不是解决如何在XAMPP中实现它 - 这是肯定可以做到的。你的答案是这个问题的一个(非常好的)替代解决方案,但并不是被问到的问题的答案。 - Andy
1
就2021年而言,Docker在Windows上相当难以使用,由于WSL模块与访问文件存在缺陷,它非常缓慢。你最好使用xampp或wamp。 - Flame
显示剩余2条评论

11
我使用Uniserver。
它内置了这个功能。

http://www.uniformserver.com/

就是这么简单。

Uniform Server是Windows下的免费轻量级WAMP服务器解决方案。小于24MB,模块化设计,包括最新版本的Apache2、Perl5、PHP(可在PHP53、PHP54、PHP55或PHP56之间切换)、MySQL5或MariaDB5、phpMyAdmin或Adminer4。无需安装!没有注册表残留!只需解压并启动!

它甚至可以运行在闪存驱动器上。具有cron仿真、支持perl、mariaDB、几个版本的Mysql、filezilla服务器和其他一些功能。

enter image description here


这是我认为最好的解决方案。它救了我的命。 - s.k.paul
1
我收到了一个病毒警报。Win32/Uwamson.A!ml - Norman Huth

10

可以的。我假设你已经安装了xampp。

  • 关闭所有xampp实例。使用任务管理器停止apache和mysqld。
  • 然后将xampp重命名为xampp1或者其他名字。
  • 现在下载其他xampp版本。创建一个名为xampp的文件夹。在那里安装所下载的xampp。
  • 现在根据您需要的xampp版本,只需将目标文件夹重命名为xampp,将其他文件夹重命名为不同的名称即可。

这就是我如何使用多个xampp的方法


7
不确定为什么这个回答会被踩,因为它确实有效,并且恰好回答了问题的要点。在没有提出建议改进的情况下悄悄地踩一下并不是一个聪明的做法。 - Fabian S.
@FabianSchöner 谢谢。我不知道为什么我的回答会被踩。 - Nazmul
1
它被投票降低的原因是因为已经有人发布了完全相同的答案。其次,这是一种完全不必要的做法,因为您只是为了获得微小的差异而再次安装所有相同的软件。正如我发布的答案中所述,可以使用一个XAMPP安装程序,然后配置它以使用不同版本的PHP。 - Andy
1
对于处理不同依赖关系的不同项目并且没有太多时间去深入了解细节的开发人员来说,这个解决方案是最佳选择。直到我看到这个方案,我才意识到原来这种方式更容易。 - josevoid
我所采用的唯一解决方案就是这个! - Federico Schiocchet
这个可行且更容易实现。 - Shakir Muhammed

10

除非一定需要使用XAMPP,否则你可以尝试使用WAMP获得你所需的功能。WAMP本质上与XAMPP类似,只是打包方式不同。

安装完成后,您可以在此处轻松切换php版本:

enter image description here

您可以安装尽可能多的PHP版本。

以下是详细步骤。

请访问此网址:WAMP下载

然后选择您要使用的基本服务器,例如带有php7的最新版本。

安装完WAMP 3后,转到附加组件文件夹并选择您需要的php版本(或版本)。他们提供从php 5.3.29开始的各种php版本,应该可以使用mysql_connect。

要安装插件,请在安装过程中(双击exe文件)指向您安装WAMP 3的文件夹。

然后,您可以使用其他文件夹的内容,例如应用程序等来添加更多功能。

所有内容都已接口化,因此您可以专注于编码而不是破解环境。


9
我正在处理一项十年前的工作项目,因此5.6是我的默认版本。还有一些较旧的小项目只能使用5.2,并且我也想在个人项目中使用7.3.8的新版本。
以下是我为将5.2和7.3.8添加到默认的5.6版本所做的操作:
1- 下载php TS版本;
v7.3.8(最新版本) : https://windows.php.net/download/ v5.2 : https://www.apachelounge.com/viewtopic.php?t=7349 2- 按顺序提取到c:\xampp\php738和c:\xampp\php52文件夹中
3- 在httpd-xampp.conf(或httpd.conf)的底部添加以下行;
***重要提示:您不应该将脚本别名名称用作目标文件夹名称,它们必须不同。(例如/php7x可以,但/php7不行)

PHP 7.3.8适用于文件夹D:\www\php7

ScriptAlias /php7x "C:/xampp/php738"
Action application/x-httpd-php7-cgi /php7x/php-cgi.exe
<Directory "C:/xampp/php738">
    AllowOverride None
    Options None
    Require all denied
    <Files "php-cgi.exe">
        Require all granted
    </Files>
</Directory>

<Directory "D:\www\php7">
    <FilesMatch "\.php$">
        SetHandler application/x-httpd-php7-cgi
    </FilesMatch>
</Directory>

PHP 5.2对于文件夹D:\www\php52

ScriptAlias /phpold "C:/xampp/php52"
Action application/x-httpd-phpold-cgi /phpold/php-cgi.exe
<Directory "C:/xampp/php52">
    AllowOverride None
    Options None
    Require all denied
    <Files "php-cgi.exe">
        Require all granted
    </Files>
</Directory>

<Directory "D:\www\php52">
    <FilesMatch "\.php$">
        SetHandler application/x-httpd-phpold-cgi
    </FilesMatch>
</Directory>

一些有用的提示:

  • 如果在使用composer时遇到php5.x问题,请切换终端到7.3.8。
  • 如果您想将php 7.3.8设置为Windows默认命令行php解释器,只需更改Windows环境路径以指向7.3.8文件夹路径即可。
  • 不要忘记按需要在每个版本文件夹中编辑相关的php.ini配置。

最后附上一个额外的提示,如果您需要使用任何版本设置虚拟主机,可以采用类似的方法。下面是一个适用于php 7.3.8的Laravel虚拟主机配置示例:

<VirtualHost *:80>
ServerAdmin admin@laravel.local
DocumentRoot "D:\www\vhosts\laravel.local\public"
ServerName  laravel.local
<FilesMatch "\.php$">
 SetHandler application/x-httpd-php7-cgi # escape for default php version
#SetHandler application/x-httpd-phpold-cgi # unescape for php 5.2
</FilesMatch>

ErrorLog "logs/laravel.local.log"
CustomLog "logs/laravel.local.log" combined

感谢 @Munim Munna 提供详细的答案,我想分享一个实例并注明重要提示。

这不是非线程安全的吗? - S. Dre
对于 Windows Apache 快速 CGI NTS 被使用。 - Erdinç Çorbacı

6

您可以有两个不同版本的XAMPP。

  • https://www.apachefriends.org/download.html下载这些文件,并安装到您选择的目录中,例如C: \ 5.6.31 \ xampp和C:\7.1.18\xampp。
  • 每次安装后,转到已安装的目录(例如C:\ 5.6.31 \ xampp,C:\ 7.1.18 \ xampp),然后启动“setup_xampp.bat”,您应该会看到像这样的东西。
  • 您可以在桌面上创建“xampp-control.exe”的快捷方式(右键单击“xampp-control.exe”发送至 -> 桌面),并将快捷方式重命名为“xampp 5.6.31”和“xampp 7.1.8”等。
  • 双击“xampp-control.exe”或先前创建的快捷方式启动XAMPP控制面板,然后启动Apache和MySQL服务器。
  • 要测试安装,请在浏览器中输入127.0.0.1或localhost,然后打开XAMPP启动屏幕。
  • 请勿打开多个XAMPP控制面板。
  • XAMPP卸载?只需删除“xampp”目录。但请在删除之前关闭Apache和MySQL。
  • 就是这样。您可以使用不同的PHP版本打开相应的XAMPP控制面板。

如果真的可以用一次安装完成,为什么不发布解决方案呢?实际上安装两个版本非常困难,这里的所有解决方案都是错误的... - Federico Schiocchet
@Andy 如果数据库不是很大,双重安装是一个可行的选择。但你的回答得到了我的赞同。 - Jeffz

6

在命令提示符窗口(cmd.exe)中运行此命令。

set PATH=C:\xampp\php;%PATH%

根据您安装php 7的位置进行更改。


在cmd中,我按照Munim Munna的答案只得到了随xampp一起安装的php版本。但是,在我执行了你的脚本后,php版本发生了改变。感谢你的回答。 - Boopathi D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接