所以我希望能够通过一个简单的解决方案来读取数据库中的记录并将其保存到用户下载的文本文件中。我一直在做这个动作,并且在20,000条记录下,这个工作很棒。超过20,000条记录,我正在将太多数据加载到内存中,并且PHP遇到了一个致命错误。将1000条记录输出到文本文件
我的想法是只抓住一切。所以我抓住XX行数并将它们回显到文件中,然后循环获取下一个XX行,直到完成为止。
虽然我只是在回应结果,但没有构建文件,然后发送下载,我猜我必须这样做。
这个问题很简单,最多有20000行,这个文件可以完美地构建和下载。除此之外,我得到一个空文件。
代码:
header('Content-type: application/txt');
header('Content-Disposition: attachment; filename="export.'.$file_type.'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
// I do other things to check for records before, hence the do-while loop
$this->items = $model->getItems();
do {
foreach ($this->items as $k => $item) {
$i=0;
$tables = count($this->data['column']);
foreach ($this->data['column'] as $table => $fields) {
$columns = count($fields);
$j = 0;
foreach ($fields as $field => $junk) {
if ($quote_output) {
echo '"'.ucwords(str_replace(array('"'), array('\"'), $item->$field)).'"';
} else {
echo ''.$item->$field.'';
}
$j++;
if ($j<$columns) {
echo $delim;
}
}
$i++;
if ($i<$tables) {
echo $delim;
}
}
echo "\n";
}
} while($this->items = $this->_model->getItems());
命中哪个致命错误?知道这将有助于。例如,如果它是超时限制;增加它。内存限制为 –
。而且我知道我可以增加内存限制(它在VPS上),但我想要一个可以扩展一点的解决方案,因为它已经达到了25,000个限制,我可能想在某个时间点导出数百万个 –
我猜测输出缓冲区在文件末尾刷新之前已经填满了最大值。尝试将输出文件写入服务器上的磁盘,然后使用'readfile'将其作为下载文件发送。 – 2013-06-27 02:37:15