牛马论坛查看原帖 →

php5.6 升级到 php8.3.36 踩的一些坑

🐈nico 3 阅读 8 回复
修复漏洞的紧急时期做项目版本升级太匆忙了,容易忙中出错。我低版本项目全部都是保持版本的,给 PHP 打补丁就好了,社区有很多大佬基于官方 PHP7.4 补丁包给低版本打的补丁代码
https://github.com/vperetti/php-cve-2026-109618-109619-backports/blob/main/patches/php-5.6-CVE-2026-109618-109619.patch
@SoulFlame 公司还是选择升级到 8.4 的方案了,一次性清理遗留问题, 线上报错, 立即解决, 肯定有一个过渡期, 现在修改代码的成本太低了
个人的项目经验:大量数据导出之类的耗时操作,最好设计成后台异步执行的方式,导出过程的进度和结果通过消息传递跟 UI 交互,导出结果放在服务器的下载区一段时间或者扔到对象存储。这样提交了任务就可以关掉 UI 不管了,导出结束之后再下载文件。
最近 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 一定会困难重重,但是一旦开始执行,一个个问题解决也发现其实也很容易就处理了。
⚠️内容来自互联网,如有侵权请点击反馈!侵权投诉
@SoulFlame 最主要是这个项目以后还是要正常运营,也是一个盈利项目,后续还可能会有功能新增,所以升级到最新版本也有利于后续开发维护。
隐性的,不会报错但是行为发生的改变,不敢升级啊,比如这种:比较 之前 之后0 == "0" true true0 == "0.0" true true0 == "foo" true false0 == "" true false42 == " 42" true true42 == "42foo" true false
隐性的,不会报错但是行为发生的改变,不敢升级啊,比如这种:比较 之前 之后0 == "0" true true0 == "0.0" true true0 == "foo" true false0 == "" true false42 == " 42" true true42 == "42foo" true false
导出超时我也踩过,8.x 里 max_execution_time 和 Apache Timeout 是两套机制,谁先到就砍谁,光调 apache 不够。你这导出是同步跑还是丢队列了?
[这只是一个小尾巴]

阅读全文与全部回复 →