【发布时间】:2013-08-12 09:36:39
【问题描述】:
虽然我的应用程序是使用 Yii 框架构建的,但这更像是一个普遍的 PHP 问题(我认为)。
我有一些代码采用 Yii CActiveDataProvider,循环它并构建一个 CSV 导出。这很好用,并且可以正确构建和发送 CSV。
我在尝试导出更大的数据集时遇到问题。我已经成功输出了 ~2500 条记录,没有任何问题,但是当我为一组更大的数据(~5000 条记录)运行完全相同的代码时,脚本似乎运行正常,但发送了一个零长度/空白 CSV。我不知道为什么......它似乎运行了一段时间,然后发送 CSV,日志中没有错误或警告。可能是输出在准备好之前被刷新或类似的吗?
代码如下(为了清楚起见,这里添加了几个内联的 cmets):
<?php
header('Content-type: text/csv');
header('Content-Disposition: attachment; filename="vacancies.csv"');
set_time_limit(240); // I know this is arbitrarily long, it's just to avoid any timeout
$outstream = fopen("php://output", 'w');
$headings = array(
$vacancy->getAttributeLabel('vacancy_id'), // this is a Yii method that returns the active record attribute as a string
...
);
fputcsv($outstream, $headings, ',', '"');
foreach($dp->getData() as $vacancy){ // the getData() method pulls the next active record model out of the Yii dataprovider and the values for various attributes are set below
$row = array(
$vacancy->vacancy_id,
...
);
fputcsv($outstream, $row, ',', '"');
}
fclose($outstream);
?>
对于为什么这在一定数量的记录下可以正常工作有什么想法吗?
更新 按照下面的建议重新检查日志后,我发现我实际上内存不足,doh!
我可以写出到文件系统,这可以让我获得大约 3000 条记录,但随后内存不足。知道更改代码以避免内存不足的最佳方法吗?
【问题讨论】:
-
超时?超出内存?检查服务器日志
-
您是否尝试过整理输出,然后传输标头(包括
Content-Length标头)和数据? -
感谢您的回复,我重新检查了 apache 错误日志,确实看起来我写文件时内存不足。由于某种原因,我之前没有发现这一点。将文件写入磁盘可以让我在它死前获得大约 3000 条记录。现在我需要弄清楚如何在不耗尽内存的情况下写入文件!