我遇到过几次这个问题。
我有一段将数据导出到 CSV 的代码。我使用的方法将结果集传递给模板,模板循环遍历结果,回显字段。
在行动中:
$this->result = ObjectPeer::doSelect($criteria);
在模板中:
foreach ($result as $row)
{
echo $row->getValue1().','.$row->getValue2().','.$row->getValue3()...
}
但是,如果结果集很大,我会用完内存:
[error] PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 1556481 bytes) in exportSuccess.php on line 13, referer: https://mysite.com/module
该过程使用了超过 250 mb,但它创建的文件只有 ~2 mb。我可以增加 php.ini 为进程提供的内存量,但我宁愿不这样做。如果导出足够大,我有点怀疑我能否给它足够的内存。
我读过一些与此类似的其他案例,这些案例建议在每次回显后取消设置 $row。这在我的情况下不起作用。
我认为有一种方法可以将这个查询分块并仍然构建整个文件 - 任何人都可以推荐或指向一个清晰的教程吗?