我通过使用内置的fputcsv函数通过标准输出(php://输出)输出一个大的csv文件,但是在写了大约14000行之后我得到了一个内存错误。
我调用ob_end_clean不使用输出缓冲区,但它不起作用。此外,我尝试在每X行之后刷新输出缓冲区,但它是相同的。
以下是我的代码片段:
function outputCSV($data) {
ob_end_clean(); //Delete buffer contents and disable output buffering
$outstream = fopen("php://output", "w");
function __outputCSV(&$vals, $key, $filehandler) {
fputcsv($filehandler, $vals);
}
array_walk($data, "__outputCSV", $outstream);
fclose($outstream);
}
答案 0 :(得分:0)
你可能会发现你处于比你意识到的更深层次的输出缓冲。
意味着您的ob_end_clean()
实际上只是丢弃并结束当前的缓冲级别。
要调试此功能,您可以添加到您的功能中:
function outputCSV($data) {
ob_end_clean(); // Delete topmost buffer
print_r(ob_list_handlers()); // Dump the remaining output buffer handlers
exit; // Call exit so we can see what's happenining
// Rest of your code ...
}
如果print_r
返回空的Array()
以外的任何内容,那么您仍然有一个或多个级别的输出缓冲。在这种情况下,请为每个缓冲区再次调用ob_end_clean()
。
如果Array()
确实是空的,那么可能会有不同的问题,对不起,我无法帮助:)