虽然我的应用程序是使用 Yii 框架构建的,但这更像是一个普通的 PHP 问题(我认为)。
我有一些代码,它采用 Yii CActiveDataProvider,循环它并构建一个 CSV 导出。这很好用,可以正确构建和发送 CSV。
尝试导出更大的数据集时遇到问题。我已经成功输出了 ~2500 条记录,没有任何问题,但是当我为一组更大的数据(~5000 条记录)运行完全相同的代码时,脚本似乎运行正常,但发送了一个零长度/空白 CSV。我不知道为什么......它似乎运行了一段时间,然后发送 CSV,日志中没有错误或警告。可能是输出在准备好之前被刷新或类似的吗?
代码如下(为清楚起见,在此处添加了一些内联注释):
<?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 条记录,但随后内存不足。知道更改代码以避免内存不足的最佳方法吗?