You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP读取大型JSON文件导致网站缓慢的高效解决方法

你当前使用的file_get_contents+json_decode逻辑慢的核心原因,是会将整个JSON文件完整读入内存后再做全量解析,文件体积越大,内存占用越高、解析耗时越长,大文件场景下很容易拖慢请求响应,甚至触发PHP内存上限报错。

方案1:流式解析(大文件场景首选)

流式解析不会一次性加载全量文件内容,而是逐段读取文件流、逐段解析结构,内存占用不会随文件体积增长,哪怕是GB级别的JSON文件,内存占用也可以稳定在几MB级别。
你可以使用成熟的流式JSON解析组件处理,示例用法:

// 组件通过composer安装完成后,可直接从文件流读取解析
$items = \JsonMachine\Items::fromFile($pathToFile);
foreach ($items as $item) {
    // 逐条处理数据,无需等待全文件解析完成
    // 仅提取你需要的字段即可,不用把所有数据都存入变量
}

如果只需要JSON中的部分字段,用流式解析的性能提升最明显,不需要为不需要的内容消耗解析资源。

方案2:预生成缓存(适合静态JSON文件场景)

如果你的JSON文件更新频率很低,不要在每次用户请求时重复做JSON解析,在文件内容更新时提前生成PHP格式的缓存文件,业务请求时直接加载缓存即可:

// 以下逻辑仅在JSON文件更新时执行1次
$rawJson = file_get_contents($pathToFile);
$parsedData = json_decode($rawJson, true);
// 把解析好的数组存成PHP原生数组文件
file_put_contents($cacheFilePath, '<?php return ' . var_export($parsedData, true) . ';');

// 业务请求时直接加载缓存,加载速度比实时解析JSON快5-10倍
$json_data = include $cacheFilePath;

PHP对原生数组文件的加载是底层编译级别的处理,效率远高于运行时解析JSON字符串,适合配置类、字典类不常变动的JSON文件。

方案3:基础优化(适合几十MB以内的中小文件)

如果文件体积不算大,可以通过几个小调整提升解析速度:

  • 开启OPcache扩展,能大幅提升PHP加载、解析内容的执行效率
  • 不需要关联数组时,将json_decode的第二个参数设为false,解析成stdClass对象的速度比关联数组快15%左右
  • 适当调高PHP的memory_limit配置,避免解析过程中因为内存不足触发系统内存交换拖慢速度

不要尝试手写逐字符的JSON解析逻辑,JSON存在嵌套、转义、编码等大量边界情况,手写逻辑很容易出现解析错误,直接使用成熟组件即可。

内容的提问来源于stack exchange,提问作者grey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 21:36:42