PHP多版本共存靠运行时环境分离实现:Web服务器按站点路由至不同PHP-FPM实例,CLI通过版本化命令(如php8.1)调用;需独立安装各版本、隔离socket/端口、Nginx显式指定fastcgi_pass、CLI避免修改系统php软链,并确保Composer及扩展与对应PHP版本严格匹配。

PHP 多版本共存不是靠“切换全局版本”实现的,而是靠分离运行时环境——Web 服务器(如 Nginx/Apache)按虚拟主机或 location 路由到不同 PHP-FPM 实例,CLI 则靠符号链接或版本前缀命令控制。硬改系统默认 php 命令指向,只会引发依赖混乱。
用 PHP-FPM 分离不同版本的 FastCGI 进程
每个 PHP 版本需独立编译安装(推荐源码或 phpbrew/asdf),并配置专属的 php-fpm.conf 和 www.conf,关键点在于端口或 socket 文件不能冲突:
-
listen = /run/php/php8.1-fpm.sock和listen = /run/php/php8.3-fpm.sock是安全隔离方式 - 若用 TCP,必须指定不同端口,例如
listen = 127.0.0.1:9001(8.1)、listen = 127.0.0.1:9003(8.3) - 每个
www.conf中的php_admin_value[open_basedir]建议按项目路径锁定,避免跨版本文件误读
Nginx 配置中按站点绑定对应 PHP-FPM 实例
不要在 http 块里写死 fastcgi_pass;每个 server 或 location ~ \.php$ 内显式指定后端:
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
多个站点可分别指向不同 socket,甚至同一域名下用 path 区分(如 /v81/api/ → 8.1,/v83/app/ → 8.3),只需配合 location ^~ /v83/ 和内部重写即可。
立即学习“PHP免费学习笔记(深入)”;
CLI 场景下避免 php 命令冲突
不建议直接修改 /usr/bin/php 软链——这会影响系统工具(如 apt 的 postinst 脚本)。正确做法是:
- 保留
php指向系统默认(通常为 LTS 版本),用于运维脚本 - 为开发环境添加带版本号的命令:如
php8.1、php8.3,通过update-alternatives --install注册,或用asdf local php 8.3.5(需项目级.tool-versions) - Composer 必须与目标 PHP 版本对齐:运行
php8.3 composer install,而非composer install(后者调用的是默认php)
最易被忽略的是 opcache.enable_cli 和 extension_dir —— 不同 PHP 版本的扩展路径(如 /usr/lib/php/20230831/)和 OPCache 共享内存段完全隔离,但若 CLI 脚本意外加载了为其他版本编译的 .so,会直接报 undefined symbol 错误,且不提示具体版本不匹配。











