CentOS PHP-FPM多版本共存,编译安装与remi源方案对比
线上跑的老项目死咬PHP 5.6,新项目又嚷嚷着要用PHP 8.2,系统偏偏是CentOS 7,默认仓库只剩5.4。想装多版本,百度一搜全是“编译安装”和“remi源”两种声音,到底谁更稳?谁更快?谁后期不埋雷?我把两套方案都踩了一遍,记录成这份笔记,省得你再通宵返工。

为什么要多版本共存
同一台机器上,不同虚拟主机、不同目录、甚至不同接口,可能需要完全不同的PHP解释器。统一升级?老代码直接白屏;分别上容器?小公司就一台云主机,钱包不允许。最经济的办法就是让PHP-FPM多版本并肩跑,Nginx按域名或路径把流量分发到对应版本的FPM池子,互不打扰。
编译安装:全程自己掌舵
优点
1. 版本任选:从5.3到8.3,哪怕冷门RC,都能第一时间尝鲜。
扩展精减:不需要的mysqli、pdo、gd一键去掉,内存占用直接砍半。

路径独立:所有文件塞进/opt/php56、/opt/php82,升级系统不会误删。
缺点
1. 时间黑洞:编译一次PHP 8.2在1C2G的小机上得三十分钟,遇上依赖缺失能折腾到凌晨。
安全补丁:官方放出CVE修复,你得手动重新编译,错过一天就可能被扫。
扩展地狱:新装Redis扩展要先装igbinary,再装msgpack,版本号对不上直接段错误。
操作流程速记

1. yum groupinstall "development Tools" 装好编译链。
下载源码,./buildconf --force 生成配置脚本。
./configure --prefix=/opt/php82 --enable-fpm --with-openssl --with-curl ... 扩展列表写全。
make -j$(nproc) && make install,顺手把php-fpm.service丢进/etc/systemd/system。
复制php.ini-production到/opt/php82/lib,改时区、开错误日志。
给不同版本分配9000、9001、9002端口,池子名字叫www56、www74、www82,Nginx里upstream对应好。
remi源:站在巨人肩膀
优点
1. 一条命令:yum install php82-php-fpm,五分钟喝口咖啡就装好。
补丁及时:Remi跟官方同步,yum update一夜醒来漏洞已补。
多版本并行:php56-php-fpm、php74-php-fpm、php82-php-fpm包名自带版本号,systemd单元文件也给你配好,端口、池子、日志全分离。
缺点
1. 扩展不全:冷门扩展如seaslog、xlswriter没进仓库,还得自己pecl编译,瞬间回到解放前。
路径难记:可执行文件藏在/opt/remi/php82/root/usr/bin,配置在/etc/opt/remi/php82,敲命令得打全路径,写脚本容易眼花。
依赖冲突:remi的php-common与base仓库的php-cli名字相同,新手一不留神就把系统自带PHP升级成remi版,面板软件直接罢工。
操作流程速记
1. yum install epel-release && yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm。
yum install yum-utils,用yum-config-manager --enable remi-php82打开对应仓库。
yum install php82-php-fpm php82-php-mysqlnd php82-php-xml ... 缺啥装啥。
systemctl enable php82-php-fpm && systemctl start php82-php-fpm,日志默认在/var/opt/remi/php82/log。
Nginx里fastcgi_pass 127.0.0.1:9002,端口与编译方案保持一致,后期迁移无压力。
性能对比实测
同一台2C4G的ECS,ab -c 50 -n 10000压测纯PHPinfo页面,结果如下:
编译版PHP 8.2:RPS 4200,内存占用28MB/进程。
remi版PHP 8.2:RPS 4150,内存占用30MB/进程。
差距在3%以内,基本可以当作误差。瓶颈主要在网络和框架,选谁都能顶住日活十万级。
维护成本算账
编译方案:每月需抽半小时盯CVE,重新编译、重启FPM,一年六次大版本升级,合计6小时。
remi方案:yum update自动完成,一年两次小版本升级,合计30分钟。
人力按300元/小时算,编译方案一年多花1650元,对个人博客无所谓,对公司就是真金白银。
到底怎么选
1. 机器数量≤3,业务生命周期<1年,直接remi,把精力留给业务。
需要定制扩展、裁剪功能、静态编译openssl,或者要跑最新alpha版,再考虑编译。
混合策略也香:稳定版本用remi,实验版本编译安装,同一端口不同池子,灰度切换。
常见坑排雷
1. systemd单元文件里PrivateTmp=true会导致/tmp下socket无法共享,改false或换端口。
remi安装后忘记关base仓库的php,yum update把系统php升级,面板瞬间失联,记得exclude=php*。
编译时没加--with-fpm-systemd,结果php-fpm不会响应systemctl stop,kill -9都杀不掉,只能重启机器。
Nginx与FPM跑不同用户,上传目录没权限,把pool里的listen.owner、listen.group改成nginx即可。
想省事、求稳、业务优先,remi源是CentOS PHP-FPM多版本共存的最短路径;想玩新特性、榨干性能、团队有编译大佬,源码编译给你绝对自由。先评估人力,再评估业务,最后动手,别让自己在机房后悔。
