2013-06-19 4 views
0

Я выводил большой файл csv через стандартный вывод (php: // output) с помощью встроенной функции fputcsv, но я получаю ошибку памяти после записи около 14000 строк.Утечка памяти при использовании fputcsv

Я вызвал 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

Вы, вероятно, обнаружите, что вы находитесь в более глубоком уровне буферизации вывода, чем вы предполагаете.

Это означает, что ваш 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() действительно пуст, может возникнуть другая проблема, и я сожалею, что не смог помочь :)

Смежные вопросы