最近 php 爆出了 9.3 分的严重漏洞,我负责的一个项目 php 版本是 5.6 ,之前也一直想把它升级到 7 以上的版本,但是觉得改动太大就没有动它。这次不得不升级了。
第一步:本地搭建 php8.3.36 环境,然后用 claude code 做兼容性检查修复并导出 excel 文件,共检查出 284 出不兼容,常见的问题是:数据库返回类型、des 加密、已移除函数、类型错误问题。
第二步:搭建和生产环境一样的测试环境,测试覆盖常用业务。
第三部:在生产环境通过 remi 安装 php8.3.36 。另外新建目录将修改后的代码上传到该目录。新建 apache 配置,将 prod-test 域名指向该配置。测试无误后把项目入口文件内容改成系统升级中提示,然后上传最新代码到项目文件。上传完成后把 apache 配置 php mod 改成 8.3 。然后重启 apache 完成升级。
升级后遇到的几个问题
第一:php5.6 不受 apache 配置 Timeout 的影响,而 php8.3 则会。上线后后台做大数据导出统计时报:The server is temporarily unable to service your request due to maintenance downtime or capacity problems. 后面将 apache Timeout 改成 120s 解决。
第二:升级后系统定时任务执行失败,通过执行:grep -E 'CROND.*CMDOUT|CROND.*CMD' /var/log/cron | tail -50 查出 cron 任务执行时 php 指向的还是 php5.6,后面将任务里的 php 改成 php8.3 解决。
第三:array_multisort 数组排序在 php8.3 中报错 Array sizes are inconsistent ,原因时多个数组元素数量不一致导致。
第四:json 解析时会报:json_decode(): Argument #1 ($json) must be of type string, 处理方案时解析前判断参数是否为字符串和是否为空。
总结:从周漏洞爆发到周日升级,总共用时 3 天解决。现在有 ai 辅助,修改代码比之前简单多了,但是 ai 也不是万能的,像类型定义错误、json 解析和数组问题 ai 都没有检查出来。以前觉得从 5.6 升级到 8.3 一定会困难重重,但是一旦开始执行,一个个问题解决也发现其实也很容易就处理了。
第一步:本地搭建 php8.3.36 环境,然后用 claude code 做兼容性检查修复并导出 excel 文件,共检查出 284 出不兼容,常见的问题是:数据库返回类型、des 加密、已移除函数、类型错误问题。
第二步:搭建和生产环境一样的测试环境,测试覆盖常用业务。
第三部:在生产环境通过 remi 安装 php8.3.36 。另外新建目录将修改后的代码上传到该目录。新建 apache 配置,将 prod-test 域名指向该配置。测试无误后把项目入口文件内容改成系统升级中提示,然后上传最新代码到项目文件。上传完成后把 apache 配置 php mod 改成 8.3 。然后重启 apache 完成升级。
升级后遇到的几个问题
第一:php5.6 不受 apache 配置 Timeout 的影响,而 php8.3 则会。上线后后台做大数据导出统计时报:The server is temporarily unable to service your request due to maintenance downtime or capacity problems. 后面将 apache Timeout 改成 120s 解决。
第二:升级后系统定时任务执行失败,通过执行:grep -E 'CROND.*CMDOUT|CROND.*CMD' /var/log/cron | tail -50 查出 cron 任务执行时 php 指向的还是 php5.6,后面将任务里的 php 改成 php8.3 解决。
第三:array_multisort 数组排序在 php8.3 中报错 Array sizes are inconsistent ,原因时多个数组元素数量不一致导致。
第四:json 解析时会报:json_decode(): Argument #1 ($json) must be of type string, 处理方案时解析前判断参数是否为字符串和是否为空。
总结:从周漏洞爆发到周日升级,总共用时 3 天解决。现在有 ai 辅助,修改代码比之前简单多了,但是 ai 也不是万能的,像类型定义错误、json 解析和数组问题 ai 都没有检查出来。以前觉得从 5.6 升级到 8.3 一定会困难重重,但是一旦开始执行,一个个问题解决也发现其实也很容易就处理了。

