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流式解析逻辑(或轻量扩展),分段读取解析,避免一次性加载全部内容。
- 如果JSON是换行分隔格式(每行一个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
相关产品推荐
相关产品推荐

