一台机器同时跑 PHP 7.4 和 8.2 完全可行,关键是让两个版本的 php-fpm 各跑各的进程池,Nginx 按站点把请求转发给对应的池,互不干扰。
准备:装两套 fpm
Ubuntu 用 apt install php7.4-fpm php8.2-fpm 直接装两套,CentOS 加第三方 yum 源同理。注意扩展跟着版本走,两个版本要分别安装,比如 php8.2-mysql、php7.4-gd 各装各的。准备切换版本的站点,先核对它用到的扩展在新版本下是否都有对应包。还有一个常见误区:php -v 看到的是命令行 CLI 的版本,站点实际用的是 php-fpm 的版本,两者可以不同,定时任务走 CLI 时行为也可能和页面上不一样,验证时别看串了。
确认两个池的监听通道
两套 fpm 默认监听不同的 socket,路径形如 /run/php/php7.4-fpm.sock 和 /run/php/php8.2-fpm.sock。如果改成了监听 TCP 端口的方式,两个版本必须用不同端口,同端口会起不来。先确认两个服务都在跑:
systemctl status php7.4-fpm php8.2-fpm
站点按需指向
Nginx 站点配置里改 fastcgi_pass 一行,就能切到另一个版本:
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
其他配置不动,nginx -t 通过后 reload 即生效,不需要重启任何 fpm,反向切换同理。建议顺手用表格记下每个站点用的版本,半年后不用对着配置逐个猜。切换后站点报 502 的话,先看 Nginx 错误日志:connect() to unix:/run/... failed 基本就是 socket 路径写错,或者对应版本的 fpm 没在运行。
用 phpinfo 验证
站点根目录放一个探测文件 test.php,内容一行:<?php phpinfo();
浏览器打开,看 PHP Version 一行是不是目标版本,再看 Loaded Configuration File 指向哪份 php.ini——后续调配置要改这份才有效,改错文件等于白忙。常用扩展(mysqli、gd、curl 等)逐一核对是否加载。phpinfo 页面会暴露服务器路径、环境变量等敏感信息,验证完立刻删掉。跨大版本切换不是零成本,PHP 8 对不少老写法直接报致命错误,先在测试环境把代码过一遍再上生产;旧版本等所有站点迁完并稳定观察一个月后再卸载,卸载顺序也是先卸扩展再卸主包,别急着删,留着还有回退余地。整个过程按站点灰度推进,一天切一两个,出了问题影响面也小。