PHP 7.4 升级到 PHP 8.2 后,接口返回 JSON 数据偶发乱码-互联网 / IT 技能经验论坛-行业技能交流坊-学思阁

PHP 7.4 升级到 PHP 8.2 后,接口返回 JSON 数据偶发乱码

最近在给公司的老项目做 PHP 版本升级,从 7.4 升到 8.2 之后,遇到了一个头疼的问题,想请教下大家有没有遇到过类似情况,怎么解决的?
先说说项目情况:这是一个电商订单查询接口,用的是原生 PHP + MySQL,没有框架。升级前在 7.4 环境下运行很稳定,接口返回的 JSON 数据编码一直是 UTF-8,前端解析完全没问题。
升级步骤是按官方文档来的:
  1. 检查了所有废弃函数,把 each() 这类函数替换成了 foreach 循环;
  1. 调整了类型声明,比如原来的隐式类型转换改成了显式的 (int) 强转;
  1. 服务器环境是 Nginx + PHP-FPM,php.ini 里的 default_charset 已经设为 UTF-8mbstring 扩展也开启了。
现在的问题是:接口调用 10 次里大概会有 2 次返回的 JSON 数据出现乱码,比如中文变成  或者一串奇怪的字符。我抓包看了下,乱码的时候 Response Header 里的 Content-Type 还是 application/json; charset=utf-8,看起来是正常的。
我尝试过的排查方法:
  1. 检查数据库连接,确保 set names utf8mb4 已经执行,查询出来的字段直接 var_dump 是正常的中文,没有乱码;
  1. 在 json_encode 的时候加了 JSON_UNESCAPED_UNICODE 参数,还是会偶发乱码;
  1. 怀疑是 PHP 8.2 的新特性导致的,比如严格类型检查,但是把相关代码改成兼容模式后问题依旧;
  1. 查看 PHP 错误日志,没有相关的报错信息,日志里都是正常的访问记录。
现在实在没头绪了,有没有大佬能指点下排查方向?或者有没有遇到过 PHP 版本升级后 JSON 偶发乱码的情况?万分感谢!
请登录后发表评论