Php 从大数据集获取OOM

Php 从大数据集获取OOM,php,out-of-memory,phpspreadsheet,Php,Out Of Memory,Phpspreadsheet,我试图从一个包含60k条目的数组中创建一个电子表格(XLSX)。当它导出时,它会给我一个电子表格,上面有一个PHP OOM警告,没有其他警告 $spreadsheet = new Spreadsheet(); $spreadsheet->setActiveSheetIndex(0); $activeSheet = $spreadsheet->getActiveSheet(); $rowIndex = 2; foreach ($this-&g

我试图从一个包含60k条目的数组中创建一个电子表格(XLSX)。当它导出时,它会给我一个电子表格,上面有一个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);

内存不足错误是因为系统内存不足。您可以简单地使用类似
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";
}
foreach($this->\u值为$\u val){

对于($i=1;$i尝试将内存限制设置为无限并检查它是否工作。为什么不尝试在批处理中执行此操作?我无法设置内存限制。不是说我不知道如何设置,但这不是一个选项,因为代码将位于生产服务器上。批处理也不是一个选项,因为客户端希望它位于一个文件上,即使您无法使用建议的文件在您的生产环境中执行操作时,您应该尝试将问题本地化。将其转换为CSV会将其导出,但我更希望它采用XLSX格式。@Tanaka您是否尝试过像我在第一段中建议的那样增加内存?这对您有效吗?我刚刚看到您对原始问题的评论。如果batching不是一个选项,增加内存(即使只是这一个文件,这就是我提供的
ini\u set
函数)也不是一个选项,我认为CSV是最好的答案。好吧,PHPSReadSheet无法处理创建具有大数据集的XLSX。因此必须使用CSV。我希望它在将来得到更新。