PHP 多版本共存实战:7.4 和 8.3 同时跑,互不干扰
如果你手头同时维护着老项目和新项目,一定经历过这种时刻:老项目还在用 PHP 7.4,新项目想上 8.3,可是本机只有一个 PHP。
于是你开始来回折腾:装完 7.4 忘装 8.x,切版本要改一堆配置,更别提两个项目同时要跑、谁都不肯让步的时候。今天这篇文章就讲清楚:多版本共存到底难在哪,以及怎么让 7.4 和 8.3 在同一台机器上和平相处。
一、为什么需要多版本共存
这不是矫情,是真实需求:
- 老项目动不了:线上还是 PHP 7.x,本地必须保持一致,否则上线才暴露兼容问题。
- 新项目有底线:Laravel 10/11、新框架普遍要求 PHP 8.1+,你想尝新就得有新版。
- 扩展不通用:swoole、redis 这类扩展对不同 PHP 版本要分别编译,只装一个版本满足不了全部项目。
结论很简单:开发者需要的不只是"一个 PHP",而是一台机器上同时存在多个版本,并且每个项目用哪个版本,自己说了算。
二、传统做法有多麻烦
在讲省事方案之前,先看看传统路线有多折腾,你才知道多版本共存的含金量。
用 Homebrew 装多版本 PHP,是社区最常见的方案,但坑不少:
- 版本切换靠
brew unlink / brew link,或者手动改 PATH,顺序一错,php -v 就显示老版本。 - 每个版本的 php-fpm 端口要手动分配,改错了直接 502。
- 编译扩展时,
phpize 用的是哪个版本,决定扩展装到哪,经常出现"扩展装了,但 php -m 看不到"。
这套流程不是不能用,而是每次都要小心翼翼,尤其赶项目的时候,时间全耗在环境上了。
三、Xserver 的做法:同时安装、同时启动
Xserver 的思路是让多版本成为常态,而不是特例。
打开应用,进入「PHP」菜单,你会看到完整的版本列表,从 5.6 到 8.5 一共 8 个版本。想用几个就装几个,比如 7.4 和 8.3:
- 再点击 8.3 对应的「安装」,两个版本互不干扰。
- 安装完成后,两个版本的「启动」按钮都亮起来,可以同时启动。
每个版本都有独立的配置、php.ini、扩展目录和日志,互不影响。这意味着:
- 7.4 的 php.ini 改坏了,8.3 一点感觉都没有;
四、让每个站点用上自己的版本
版本装好了,怎么让不同项目用不同版本?答案在站点设置里。
创建站点时,表单里有一个「PHP 版本」下拉框:
站点名称: legacy-app 域名: legacy.test 端口: 80 目录: ~/Projects/legacy-app PHP 版本: 7.4 ← 老项目指定 7.4
再创建一个新项目站点,这次选择 8.3:
站点名称: modern-api 域名: api.test 端口: 8080 目录: ~/Projects/modern-api PHP 版本: 8.3 ← 新项目指定 8.3
保存后,两个站点各自用自己的 PHP 版本跑起来。访问 legacy.test 是 7.4,访问 api.test 是 8.3,互不干扰。
如果站点建好之后想换版本,编辑站点,把「PHP 版本」改掉再保存即可,不需要重装任何东西。
五、命令行怎么用:切换默认版本
有些操作绕不开命令行,比如 composer install、跑 artisan 命令。终端里的 php -v 显示哪个版本,取决于当前注册到 PATH 的 PHP。
Xserver 在「PHP」列表里提供了环境变量管理入口,想切换默认版本时:
- 在目标版本那一行找到环境变量相关的操作(比如「注册」或切换入口)。
- 切换后新开一个终端窗口,再执行
php -v,看到的就是新版本。
注意:终端有缓存,旧窗口里看到的还是老版本,这不是没生效,开个新终端就好。这一点和 phpStudy、MAMP 等工具的行为一致。
常见问题
1. 终端里 php -v 版本不对
先确认是不是旧终端。新开一个终端再试;如果还不对,去 Xserver 的 PHP 列表切换环境变量,然后重新打开终端。
2. 老项目在 7.4 下报错,8.3 没问题
这是版本差异,先确认站点的「PHP 版本」选的是 7.4,再看项目本身是否用了 7.4 不支持的新语法(比如 8.0 的构造器属性提升)。
3. 某个版本启动失败
看对应版本的日志,常见原因是端口被占用或 php.ini 写错。修好后在 Xserver 里点「重启」即可,不影响其他版本。
最后
多版本共存解决的是"环境打架"的问题:装一次,长期受益。装好之后,下一步就是让调试更顺手——用 Xdebug 给 PHP 断点调试,再也不用 var_dump 打天下,这个我们下篇讲。
如果搭建过程中遇到问题,欢迎在评论区留言,也可以到 Xserver 官网反馈 bug 和建议。下载地址:https://x-server.ltd。