PHP升级需先检查版本与依赖,如oniguruma、libxml2、openssl等;复原configure参数,匹配Web服务器类型;make install后手动迁移配置、更新模块路径并验证扩展与opcache生效。

确认当前 PHP 版本和系统依赖是否满足新版本要求
直接编译升级前,先用 php -v 和 php --modules 查清现状。很多失败源于忽略底层依赖:比如 PHP 8.0+ 需要 oniguruma(正则库)、libxml2 >= 2.9.0、openssl >= 1.1.1;CentOS 7 默认的 OpenSSL 1.0.2 会直接导致 configure 报错 openssl version too old。
建议操作:
- 运行
yum install -y oniguruma-devel libxml2-devel openssl-devel sqlite-devel curl-devel libpng-devel libjpeg-devel freetype-devel gmp-devel(RHEL/CentOS) - 检查
which libtool,缺失则装libtool,否则make时可能卡在libtool: error: cannot find the library - PHP 8.2+ 还需
pkg-config,否则 configure 提示pkg-config not found
configure 参数必须匹配原有扩展和 Web 服务器类型
用 php -i | grep "Configure Command" 复原旧参数是关键。漏掉 --with-apxs2(Apache)或 --enable-fpm(Nginx + PHP-FPM)会导致服务无法启动;而硬加 --with-mysql(已废弃)会触发编译失败。
常见适配要点:
立即学习“PHP免费学习笔记(深入)”;
- Apache 用户:必须指定
--with-apxs2=/usr/bin/apxs(路径以which apxs为准),且新版 PHP 的libphp.so默认不生成,需确认 configure 输出含apxs: enabled - Nginx 用户:务必保留
--enable-fpm,FPM 配置文件位置默认变为prefix/etc/php-fpm.d/www.conf,不是原来的php-fpm.conf - 扩展一致性:旧版用了
--with-pdo-mysql=mysqlnd,新版本仍得写mysqlnd,改用mysqli或省略会导致 PDO 连接报Driver not found
make install 后不能直接 reload,必须处理配置与服务衔接
make install 只复制二进制和基础配置,不会覆盖 php.ini 或重启服务。直接 systemctl reload httpd 很可能加载旧模块或报 undefined symbol: zend_string_release_ex —— 这是 ABI 不兼容的典型信号。
必须手动执行:
- 备份并迁移原
php.ini:新版本的php.ini-production在prefix/lib/下,别直接覆盖,用diff -u合并自定义项(如date.timezone、extension_dir) - Apache 用户:确认
LoadModule php_module modules/libphp.so指向新路径,且httpd -M | grep php显示模块已加载 - FPM 用户:检查
php-fpm -t是否通过,再systemctl restart php-fpm;若报failed to load configuration file,大概率是php-fpm.conf中include=路径未更新
升级后验证扩展和 opcode 缓存是否真正生效
很多人看到 php -v 版本变了就以为成功,但 opcache、redis、imagick 等扩展常因路径或依赖变化失效。尤其 opcache 在 PHP 8.0+ 默认启用,但若 opcache.so 仍指向旧版路径,会静默降级为未启用状态。
快速验证方法:
- 运行
php -m | grep -E "(opcache|redis|mysqli)",确认扩展名存在 - 执行
php -r "echo opcache_get_status()['opcache_enabled'] ?: 'disabled';",输出1才算真正启用 - 检查
phpinfo()页面中Loaded Configuration File路径是否为新安装路径,避免还在读旧php.ini - 如果用 Composer,跑一次
composer diagnose,PHP 版本跳变可能导致platform-check报错,需同步调整composer.json的config.platform.php
最易被忽略的是 extension_dir 值——它在新版本中常变成 prefix/lib/php/extensions/no-debug-non-zts-20220829/(数字随 PHP 版本变动),旧扩展 .so 文件放错目录就会白忙一场。











