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

PHP使用file_get_contents/Curl加载大文件后内存无法释放求助

PHP大文件加载后内存无法释放的解决方案
  • 避免一次性加载整个大文件:file_get_contents会直接把2GB文件全部读入内存,再加上json_decode生成的数组,内存占用会翻倍。建议改用流式处理:

    • 如果JSON是换行分隔格式(每行一个JSON对象),用SplFileObject逐行读取解析:
      $file = new SplFileObject($file_path);
      foreach ($file as $line) {
          $item = json_decode(trim($line), true);
          // 处理单个数据项
          $item = null;
      }
      $file = null;
      gc_collect_cycles();
      
    • 如果是单个大JSON对象,使用PHP的JSON流式解析逻辑(或轻量扩展),分段读取解析,避免一次性加载全部内容。
  • 手动触发垃圾回收:PHP自动垃圾回收可能不会立即清理大内存对象,在变量置空后强制调用回收函数:

    $file_data = file_get_contents($file_path);
    $data = json_decode($file_data, true);
    
    // 业务处理逻辑
    
    // 清除引用并强制回收内存
    $file_data = null;
    $data = null;
    gc_collect_cycles();
    
  • 调整服务进程配置:如果用Apache+mod_php,设置MaxRequestsPerChild参数,让子进程处理一定请求后自动重启释放内存;如果用PHP-FPM,修改pm.max_requests(比如设为10),让FPM进程处理指定次数请求后自动退出重启,从根源避免内存累积。

  • 排查隐藏引用:检查业务逻辑中是否将$data或$file_data的引用存入全局变量、静态变量、缓存或其他持久化存储,这些残留引用会导致内存无法被回收,必须彻底清除所有相关引用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:25:00