Получение OOM из большого набора данных - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь создать электронную таблицу (XLSX) из массива, содержащего 60 тыс. Записей.Когда он экспортируется, он дает мне электронную таблицу с предупреждением PHP OOM, ничего больше.

    $spreadsheet = new Spreadsheet();
    $spreadsheet->setActiveSheetIndex(0);
    $activeSheet = $spreadsheet->getActiveSheet();

    $rowIndex = 2;

    foreach ($this->_values as $_val){
        $activeSheet->setCellValueByColumnAndRow(1, $rowIndex, trim($_val['item1']));
        $activeSheet->setCellValueByColumnAndRow(2, $rowIndex, trim($_val['item2']));
        $activeSheet->setCellValueByColumnAndRow(3, $rowIndex, trim($_val['item3']));
        $activeSheet->setCellValueByColumnAndRow(4, $rowIndex, trim($_val['item4']));
        $activeSheet->setCellValueByColumnAndRow(5, $rowIndex, trim($_val['item5']));
        $activeSheet->setCellValueByColumnAndRow(6, $rowIndex, trim($_val['item6']));
        $activeSheet->setCellValueByColumnAndRow(7, $rowIndex, trim($_val['item7']));
        $activeSheet->setCellValueByColumnAndRow(8, $rowIndex, trim($_val['item8']));
        $activeSheet->setCellValueByColumnAndRow(9, $rowIndex, trim($_val['item9']));
        $activeSheet->setCellValueByColumnAndRow(10, $rowIndex, trim($_val['item10']));
        $activeSheet->setCellValueByColumnAndRow(11, $rowIndex, trim($_val['item11']));

        $rowIndex += 1;
    }

    $spreadsheet->garbageCollect();

    $writer = new Xlsx($spreadsheet);
    $writer->setPreCalculateFormulas(false);
    $writer->setUseDiskCaching(true);
    $writer->save("php://temp");

    $spreadsheet->disconnectWorksheets();
    unset($spreadsheet);

1 Ответ

0 голосов
/ 04 июня 2018

Ошибка нехватки памяти из-за того, что вашей системе недостаточно памяти.Вы можете просто увеличить объем памяти , используя что-то вроде ini_set('memory_limit', '750M');, предполагая, что в вашей системе есть место

Или, если XLSX не нужен (то есть: можно ли использовать CSVвместо этого, который Excel все еще может открыть), вы можете передавать данные в электронную таблицу, вместо того, чтобы загружать их все в память сразу, а затем распечатывать.Это выглядело бы так:

foreach ($this->_values as $_val){
    for($i=1; $i<=11; $i++) {
        echo trim($_val['item'.$i]);
        if($i<11) echo ",";
    }
    echo "\n";
}

Вы также можете включить заголовок CSV вверху PHP-файла , чтобы на странице запрашивалась загрузка, а не показывалось содержимоефайл CSV.Это заголовок CSV cal: header("Content-type: text/csv");

...