低版本php升级需分阶段兼容性测试,先用phpstan和phpcompatibility扫描代码,再检查扩展、配置及依赖,最后通过docker多版本灰度验证,严禁跨大版本跳跃升级。

低版本 PHP 升级不是“改个配置就能跑”,直接切高版本大概率会报错、白屏、函数不可用——必须先测兼容性,再分阶段升级。
用 phpstan 和 phpcompatibility 扫描潜在不兼容点
这两个工具能提前发现语法、函数、扩展依赖等硬伤,比上线后调试快得多。
-
phpstan主要看类型错误、未定义变量、过时的魔术方法调用(比如__get在 PHP 8.2+ 对只读属性的行为变化) -
phpcompatibility是 PHPCS 的插件,专盯版本迁移问题:比如mysql_connect()在 PHP 7.0 已移除,create_function()在 7.2 废弃、8.0 彻底删除 - 运行命令示例:
phpcs --standard=PHPCompatibility --runtime-set testVersion 8.1 ./src,把8.1换成你目标版本 - 注意:扫描结果里标
WARNING的不一定崩溃,但ERROR级基本必挂
重点检查扩展依赖和 php.ini 配置变更
很多项目卡在扩展没装、配置项被删或语义反转,而不是代码本身。
- PHP 7.4 开始默认关闭
register_globals和magic_quotes_gpc,如果老代码靠它们自动过滤输入,会直接出安全漏洞 - PHP 8.0 移除了
ext/mysql、ext/mysqli不再支持mysql_old_password认证方式 -
date.timezone从“建议设置”变成“强制要求”,不设会导致date()报Warning - 检查
extension_dir路径是否还指向旧版模块目录,尤其 Windows 下常见php/ext路径硬编码
用 docker 搭多版本环境做灰度验证
别在生产服务器上试,也别只靠本地 php -v 切换——不同版本的底层依赖(如 OpenSSL、cURL)可能影响 HTTPS 请求、JWT 解析等行为。
立即学习“PHP免费学习笔记(深入)”;
- 写个最小
Dockerfile,FROMphp:7.2-apache→php:8.1-apache,复用同一份代码和配置 - 重点跑三类请求:登录态相关(session_start()、cookie 加密)、文件上传(
$_FILES结构在 8.1 有细微变化)、数据库写入(PDO 默认模式在 8.1 启用严格模式) - 记录
error_log中所有Deprecated和Notice,PHP 8+ 默认不显示它们,需显式开启error_reporting = E_ALL
升级顺序别跳步:7.2 → 7.4 → 8.0 → 8.1/8.2
跨大版本(如 7.2 → 8.1)会让问题叠加,定位成本指数级上升;中间版本既是缓冲带,也是兼容层。
- 7.4 支持
??=、箭头函数、类型声明强化,是 7.x 最稳定的终点,适合先落地稳定态 - 8.0 引入 JIT、联合类型、
match表达式,但废除大量旧特性,必须逐个确认框架/组件是否适配(如 Laravel 8+ 才完全支持 PHP 8.0) - 8.1 新增
enum、readonly,但对老项目影响小;8.2 开始更激进(废弃动态属性),建议到 8.1 就停一停 - 别信“官方说向后兼容”,PHP 的“兼容”指语法不报错,不代表行为一致——比如
json_encode(null)在 7.4 返回"null",8.0+ 返回"null"字符串,但某些 JSON 解析逻辑会因此误判类型
最常被忽略的是第三方 SDK 和私有扩展:有些支付 SDK 只编译了 PHP 7.3 的 so 文件,升级后 dl(): Unable to load dynamic library 直接拒载;还有些内部写的 C 扩展没适配 Zend API 变更,得重编译甚至重写。











