php 中 json_encode() 慢的主因是默认执行冗余检查(编码检测、循环引用、浮点精度等),而非函数本身低效;应预处理数据(转 UTF-8、移除资源/闭包)、启用 json_UNESCAPED_UNICODE 等标志、流式输出大数据、开启 OPcache 并禁用 Xdebug。

PHP 用 json_encode() 返回 JSON 时为什么慢?
常见现象是接口响应时间长、CPU 占用高,尤其在返回大数组(如上千条记录、嵌套深的对象)时。根本原因不是 json_encode() 本身低效,而是默认行为做了不少“额外工作”:比如反复检测字符串编码、递归检查循环引用、对浮点数做精度处理等。
禁用非必要选项 + 预处理数据结构
PHP 7.3+ 支持 JSON_INVALID_UTF8_IGNORE 和 JSON_INVALID_UTF8_SUBSTITUTE,但更关键的是避免传入未清理的数据:
- 提前用
array_map('strval', $data)或mb_convert_encoding()统一转为 UTF-8,别依赖json_encode()自动检测 - 移除 PHP 中的资源类型(如
mysqli_result)、闭包、不可序列化对象,否则json_encode()会静默失败或触发警告 - 用
JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES减少输出体积,尤其对中文字段多的接口有明显效果 - 避免在循环中拼接数组再
json_encode(),改用yield+ 流式输出(见下一条)
大数据量时用 ob_start() + 分块 json_encode()
当要返回几千行数据库结果时,一次性构造大数组再 json_encode() 会吃光内存。不如边查边写:
// 示例:流式输出 JSON 数组 header('Content-Type: application/json; charset=utf-8'); echo '['; $first = true; foreach ($pdo->query($sql) as $row) { if (!$first) echo ','; echo json_encode($row, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); $first = false; } echo ']';
注意:这种方式跳过了 PHP 层的完整数组构建,内存占用从 O(n) 降到 O(1),但需确保前端能接受“不完整 JSON”(实际是标准 JSON 数组格式)。
立即学习“PHP免费学习笔记(深入)”;
启用 OPcache + 禁用 Xdebug(最容易被忽略的两点)
很多开发环境开着 Xdebug,json_encode() 性能直接掉 3–5 倍;OPcache 关闭则每次请求都重编译 PHP 脚本,JSON 输出只是冰山一角:
- 检查
phpinfo()中opcache.enable是否为On,且opcache.enable_cli在 CLI 场景下也开启(如用 swoole 或 Worker) - 确认
xdebug.mode不含develop或debug,生产环境应设为off - 若用 composer 自动加载,确保
composer dump-autoload --optimize-autoloader已执行,减少类查找开销
真正卡住 JSON 响应的,往往不是编码逻辑本身,而是这些外围配置没关干净。