Разрешенный размер памяти 134217728 байт, израсходованный в PhpExcel

Я экспортирую файл xlsx, используя phpexcel, данные имеют 32 столбца и много строк. Ежедневно увеличивается количество данных, поэтому данные будут очень большими. Это мой код:

$filename="data.xlsx"; $cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp; $cacheSettings = array( 'memoryCacheSize' => '128MB'); PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings); ini_set('max_execution_time', 123456); $objPHPExcel = new PHPExcel(); $objPHPExcel->setActiveSheetIndex(0); $i = 2; $objPHPExcel->getActiveSheet()->setCellValue('A1', 'Header1'); $objPHPExcel->getActiveSheet()->setCellValue('B1', 'Header2'); $objPHPExcel->getActiveSheet()->setCellValue('C1', 'Header3'); $objPHPExcel->getActiveSheet()->setCellValue('D1', 'Header4'); $objPHPExcel->getActiveSheet()->setCellValue('E1', 'Header5'); $objPHPExcel->getActiveSheet()->setCellValue('F1', 'Header6'); $objPHPExcel->getActiveSheet()->setCellValue('G1', 'Header7'); $objPHPExcel->getActiveSheet()->setCellValue('H1', 'Header8'); $objPHPExcel->getActiveSheet()->setCellValue('I1', 'Header9'); $objPHPExcel->getActiveSheet()->setCellValue('J1', 'Header10'); $objPHPExcel->getActiveSheet()->setCellValue('K1', 'Header11'); $objPHPExcel->getActiveSheet()->setCellValue('L1', 'Header12'); $objPHPExcel->getActiveSheet()->setCellValue('M1', 'Header13'); $objPHPExcel->getActiveSheet()->setCellValue('N1', 'Header14'); $objPHPExcel->getActiveSheet()->setCellValue('O1', 'Header15'); $objPHPExcel->getActiveSheet()->setCellValue('P1', 'Header16'); $objPHPExcel->getActiveSheet()->setCellValue('Q1', 'Header17'); $objPHPExcel->getActiveSheet()->setCellValue('R1', 'Header18'); $objPHPExcel->getActiveSheet()->setCellValue('S1', 'Header19'); $objPHPExcel->getActiveSheet()->setCellValue('T1', 'Header20'); $objPHPExcel->getActiveSheet()->setCellValue('U1', 'Header21'); $objPHPExcel->getActiveSheet()->setCellValue('V1', 'Header22'); $objPHPExcel->getActiveSheet()->setCellValue('W1', 'Header23'); $objPHPExcel->getActiveSheet()->setCellValue('X1', 'Header24'); $objPHPExcel->getActiveSheet()->setCellValue('Y1', 'Header25'); $objPHPExcel->getActiveSheet()->setCellValue('Z1', 'Header26'); $objPHPExcel->getActiveSheet()->setCellValue('AA1', 'Header27'); $objPHPExcel->getActiveSheet()->setCellValue('AB1', 'Header28'); $objPHPExcel->getActiveSheet()->setCellValue('AC1', 'Header29'); $objPHPExcel->getActiveSheet()->setCellValue('AD1', 'Header30'); $objPHPExcel->getActiveSheet()->setCellValue('AE1', 'Header31'); $objPHPExcel->getActiveSheet()->setCellValue('AF1', 'Header32'); foreach ($data as $value) { $objPHPExcel->getActiveSheet()->setCellValue('A'.$i, $value['1']); $objPHPExcel->getActiveSheet()->setCellValue('B'.$i, $value['2']); $objPHPExcel->getActiveSheet()->setCellValue('C'.$i, $value['3']); $objPHPExcel->getActiveSheet()->setCellValue('D'.$i, $value['4']); $objPHPExcel->getActiveSheet()->setCellValue('E'.$i, $value['5']); $objPHPExcel->getActiveSheet()->setCellValue('F'.$i, $value['6']); $objPHPExcel->getActiveSheet()->setCellValue('G'.$i, $value['7']); $objPHPExcel->getActiveSheet()->setCellValue('H'.$i, $value['8']); $objPHPExcel->getActiveSheet()->setCellValue('I'.$i, $value['9']); $objPHPExcel->getActiveSheet()->setCellValue('J'.$i, $value['10']); $objPHPExcel->getActiveSheet()->setCellValue('K'.$i, $value['11']); $objPHPExcel->getActiveSheet()->setCellValue('L'.$i, $value['12']); $objPHPExcel->getActiveSheet()->setCellValue('M'.$i, $value['13']); $objPHPExcel->getActiveSheet()->setCellValue('N'.$i, $value['14']); $objPHPExcel->getActiveSheet()->setCellValue('O'.$i, $value['15']); $objPHPExcel->getActiveSheet()->setCellValue('P'.$i, $value['16']); $objPHPExcel->getActiveSheet()->setCellValue('Q'.$i, $value['17'); $objPHPExcel->getActiveSheet()->setCellValue('R'.$i, $value['18']); $objPHPExcel->getActiveSheet()->setCellValue('S'.$i, $value['19']); $objPHPExcel->getActiveSheet()->setCellValue('T'.$i, $value['20']); $objPHPExcel->getActiveSheet()->setCellValue('U'.$i, $value['21']); $objPHPExcel->getActiveSheet()->setCellValue('V'.$i, $value['22']); $objPHPExcel->getActiveSheet()->setCellValue('W'.$i, $value['23']); $objPHPExcel->getActiveSheet()->setCellValue('X'.$i, $value['24']); $objPHPExcel->getActiveSheet()->setCellValue('Y'.$i, $value['25']); $objPHPExcel->getActiveSheet()->setCellValue('Z'.$i, $value['26']); $objPHPExcel->getActiveSheet()->setCellValue('AA'.$i, $value['27']); $objPHPExcel->getActiveSheet()->setCellValue('AB'.$i, $value['28']); $objPHPExcel->getActiveSheet()->setCellValue('AC'.$i, $value['29']); $objPHPExcel->getActiveSheet()->setCellValue('AD'.$i, $value['30']); $objPHPExcel->getActiveSheet()->setCellValue('AE'.$i, $value['31']); $objPHPExcel->getActiveSheet()->setCellValue('AF'.$i, $value['32']); $i++; } $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); ob_end_clean(); header("Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); header("Content-Disposition: attachment; filename=".$filename); header('Cache-Control: max-age=0'); $objWriter->setUseDiskCaching(true); $objWriter->save("php://output"); 

два дня назад он работает хорошо. Но сегодня это исключение: Fatal error: Разрешенный размер памяти 134217728 байт исчерпан (пытался выделить 85 байт) в /…./Classes/PHPExcel/CachedObjectStorage/CacheBase.php в строке 155

Как еще один момент, вы строите объект PHPExcel, перейдя через массив с именем $ data …. 2d-массив, который, как я предполагаю, построен из циклов по результатам запроса к базе данных.

Этот массив $ data также будет использовать большую часть вашей памяти, все больше и больше памяти каждый день по мере роста числа результатов.

Было бы более эффективным, если вместо того, чтобы перебирать базу данных с помощью набора результатов для построения большого массива, а затем перебирать этот массив для создания данных PHPExcel, вы зацикливались в наборе результатов базы данных и напрямую строили данные PHPExcel. Это устраняет накладные расходы памяти в $ data и уменьшает 2 цикла до 1.

Помните, что PHP использует память, а также сам скрипт, в дополнение к памяти, используемой объектом PHPExcel.

Если вы установите cache_to_phpTemp с memoryCacheSize, объект PHPExcel будет использовать память до этого предела, а затем переключиться на использование временного файла. Ваш memoryCacheSize совпадает с вашим абсолютным пределом памяти php.ini (128 МБ), поэтому PHPExcel никогда не переключится на использование кэша временных файлов до того, как будет достигнут собственный предел PHP. Попробуйте установить более низкое значение memoryCacheSize (например, 64 МБ), так что по крайней мере PHPExcel получит возможность кэшировать ячейки и сократить использование собственной памяти.