PHP экспортирует огромные файлы Excel - PullRequest
4 голосов
/ 06 декабря 2011

Я использую PHPExcel класс в php для экспорта данных из таблицы MySQL. Страница php просто записывает данные Excel в цикле, например:

$objPHPExcel = new PHPExcel();
# Query result goes to array $result
# ...
$i = 1;
for ($r = 0; $r < count($result); $r++) {
      # Set $value1, $value2, $value3 from $result
      $objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue("A$i", $value1)
            ->setCellValue("B$i", $value2)
            ->setCellValue("C$i", $value3);
      $i++;
}
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save("/path/to/exported_file.xlsx");

Этот код отлично работает, когда экспортируемый файл не очень большой. Мне удалось экспортировать около 10000 записей. Тем не менее, я получаю следующую ошибку, когда файл становится больше (из запроса возвращается больше записей).

Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 71 bytes)

Я увеличил предел памяти в /etc/php5/apache2/php.ini до 1024M. Даже после этого увеличения я все еще получаю эту ошибку.

Я попытался создать несколько файлов Excel вместо одного, ограничив результаты запроса, добавив LIMIT к оператору SELECT, но это также не решило проблему.

Есть идеи, как решить эту проблему?

Я использую php-5.2.4 и apache-2.2.8 на сервере Ubuntu, если это имеет значение.

Ответы [ 2 ]

3 голосов
/ 06 декабря 2011
  1. Использовать кэширование ячеек PHPExcel (если вы этого еще не сделали)
  2. Не заселять массива, просматривая набор результатов запроса базы данных, а затем заполнить PHPExcel, просматривая этот массив; заполнить PHPExcel непосредственно через цикл результатов запроса к базе данных
1 голос
/ 06 декабря 2011

Экспорт ваших записей в виде нескольких файлов Excel и объединить их вместе.О присоединении уже есть вопрос в Как я могу присоединиться к документам Excel, используя PHPExcel?

...