具体表现
导出几万条订单时页面直接白屏,日志里写着允许的内存 128M 已耗尽,调大一点又能跑但不敢一直加。
先判断哪一层出错
一次性把结果集读进数组再处理,内存随数据量线性增长,超过 memory_limit 就终止。判断时先分清是 PHP 内存超限 本身的配置问题,还是上游调用、运行环境带进来的差异;前者改配置就能收口,后者要沿着请求链路一层层往上找,处理顺序不能颠倒。先在出问题的机器上复现一次,把报错原文和发生时间记下来,再对着日志定位。
操作步骤
- 先用内存峰值定位是不是全量加载
- 改成分批读取并释放变量
- 按单批数据量估算后再调整上限
对应的命令或配置片段如下,可直接复制:
print_r([ini_get('memory_limit'), memory_get_peak_usage(true)/1048576]);
ini_set('memory_limit', '512M');
$fp = fopen('php://output', 'w');
foreach ($rows as $row) { fputcsv($fp, $row); }
如果同一现象隔一段时间又出现,多半是某个定时任务或重启流程把配置覆盖回去了,顺手查一遍启动脚本。测试环境复现不了时,先对比两边的版本号和配置文件,差异往往就在被忽略的那几行里。
收尾检查
同样的导出任务能完整跑完,内存峰值稳定在设定值以内。