0

我正在使用内置的 fputcsv 函数通过标准输出 (php://output) 输出一个大的 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);
}
4

1 回答 1

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()确实是空的,那么可能会有不同的问题,对不起,我无能为力:)

于 2013-06-19T04:35:08.057 回答