多个 PHP 网站的版本冲突处理
发布时间:2026-06-19 17:43       
更新时间:2026-06-20 15:19
先给结论:版本冲突的根源是一台机器只装了一个 PHP,所有站点被迫共用,旧程序跑在新版本上各种报错。解法是让每个站点绑定各自需要的版本,互不迁就。
## 问:什么情况会撞上这个问题
典型场景是站点 A 用了多年前的老程序,只能在 PHP 7.4 下稳定运行,新站点 B 用了 8.x 才有的语法。共用一个 php-fpm 时,升级 PHP 老站点白屏、报大量弃用警告,不升级新站点跑不起来,两头为难。报错信息通常是一串弃用警告加一个致命错误,把日志里的函数名收集起来,对照迁移指南就是一份现成的改造清单。
## 问:怎么让站点各用各的版本
主流做法是多版本 php-fpm 并存,各自监听不同的 sock 文件,站点按需指定:
```
upstream php74 { server unix:/run/php/php7.4-fpm.sock; }
upstream php81 { server unix:/run/php/php8.1-fpm.sock; }
```
server 块里 fastcgi_pass 指向对应 upstream 即可。虚拟主机或面板类环境则直接在站点设置里选版本,原理相同:一个版本一组进程,一个站点一条通道。多版本机器上还要留意:命令行的 php 和 fpm 用的可能不是同一个版本,排查时用 php-fpm -v 单独确认。
## 问:扩展不一致怎么办
不同版本的扩展包是分开安装的,比如 mysqlnd、redis 扩展在 7.4 和 8.1 下各装一份。逐站点用 php -m 核对扩展清单,缺什么补什么。部署脚本里把"目标版本加扩展列表"写成变量,避免装错对象。升级到 8.x 的站点留意弃用扩展的替代品,提前替换,比等运行时报错从容得多。
## 问:依赖怎么锁住
每个站点用 Composer(PHP 的依赖管理工具)管理依赖,composer.lock 提交进仓库,部署时统一 composer install,安装版本和锁定文件完全一致,各站点的依赖天然隔离。大版本升级前,先在测试目录跑 php -l 过语法,再全局搜一遍已弃用函数,改完再上。锁定文件出现冲突时,以测试环境的安装结果为准,不要手工去改 lock 文件。
多版本并存是过渡手段,不是终态。把老站点的升级排进计划,机器上的版本越少,要维护的通道越少,出问题的地方也越少。