Как исправить память, израсходованную с помощью PHPExcel?

Неустранимая ошибка: допустимый размер памяти 134217728 байт исчерпан (пытался выделить 1078799 байт) в D: \ xampplite \ htdocs \ Scraper \ PHPExcel \ Reader \ Excel2007.php в строке 269

Мое ограничение памяти 128M PHP быстро исчерпывается, даже когда я только пытаюсь открыть небольшой файл Excel ~ 350 КБ с помощью PHPExcel.

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

Размер файла не является хорошей мерой для файлов книг при работе с PHPExcel. Более важно количество строк и столбцов (т. Е. Ячеек).

Сам код PHPExcel имеет размер от 10 до 25 МБ, в зависимости от того, к каким компонентам обращаются.

В настоящее время каждая ячейка в книге занимает в среднем 1 тыс. Памяти (без кэширования) или 1,6 тыс. На 64-битном PHP – я предполагаю 32-битный PHP на данный момент – так (например) рабочий лист из 8000 строк с 31 столбцом (248 000 ячеек) будет около 242 МБ. С кэшированием ячеек (например, php: // temp или DiskISAM), которые могут быть уменьшены примерно до трети, поэтому для 8000 строк по 31 столбцам потребуется около 80 МБ.

Существует ряд опций, которые помогут вам уменьшить использование памяти:

Вы используете кеширование клеток с помощью PHPExcel?

require_once './Classes/PHPExcel.php'; $cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp; $cacheSettings = array( ' memoryCacheSize ' => '8MB'); PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings); $objReader = PHPExcel_IOFactory::createReader('Excel2007'); $objPHPExcel = $objReader->load("test.xlsx"); 

Если вам нужно только получить доступ к данным на ваших листах и ​​не нуждаться в доступе к форматированию ячейки, вы можете отключить чтение информации форматирования из книги:

 $objReader = PHPExcel_IOFactory::createReader('Excel2007'); $objReader->setReadDataOnly(true); $objPHPExcel = $objReader->load("test.xlsx"); 

Если вам нужно только получить доступ к некоторым, но не ко всем листам в книге, вы можете загрузить только те рабочие листы:

 $objReader = PHPExcel_IOFactory::createReader('Excel2007'); $objReader->setLoadSheetsOnly( array("Worksheet1", "Worksheet2") ); $objPHPExcel = $objReader->load("test.xlsx"); 

если вы хотите читать только определенные ячейки в листах, вы можете добавить фильтр:

 class MyReadFilter implements PHPExcel_Reader_IReadFilter { public function readCell($column, $row, $worksheetName = '') { // Read title row and rows 20 - 30 if ($row == 1 || ($row >= 20 && $row <= 30)) { return true; } return false; } } $objReader = PHPExcel_IOFactory::createReader('Excel2007'); $objReader->setReadFilter( new MyReadFilter() ); $objPHPExcel = $objReader->load("test.xlsx"); 

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

Просто потому, что файл данных имеет только X байтов, не означает, что он использует X байт памяти. Например, только 4K данных в массиве $ _SESSION использует 64K RAM при загрузке. Это просто зависит от того, что делает код с этими данными. Правильный ответ заключается в увеличении количества бара.

Кроме того, если это файл XLSX, это ZIP-документы XML. Текстовые файлы zip up намного жестче, чем 1/2, поэтому ваш 350K XLSX-файл легко представляет собой файл Excel 1MB.

PHPExcel известен утечками памяти. Я советую вам использовать следующее, для которого требуется ФРАКЦИЯ памяти, которую использует PHPExcel .:

1) Для чтения: PHP-Excel-Reader

2) Для написания: электронная таблица груши Excel Writer

Xdebug является профилировщиком / отладчиком для php и может помочь вам отслеживать использование памяти и функциональные вызовы, чтобы выяснить, в чем проблема. И его легко установить, большинство дистрибутивов Linux имеют его в репозитории, «yum install xdebug», «apt-get install xdebug».

Вы должны также отметить, что это пустые ячейки.

У меня была такая же проблема, только 800 строк данных, и скрипт даже не мог читать. Как таймауты, так и ошибки в памяти, когда они были исправлены.

Что-то @ Марк Бейкер сказал о ячейках, которые заставили меня задуматься. Я заметил, что у меня было множество пустых ячеек и копирование только ячеек с данными в новую книгу заставил его запустить за секунду.

Надеюсь, это поможет кому-то.

Если вы хотите узнать, вы можете использовать xhprof . Согласно этой ссылке вы можете отслеживать использование памяти с ней …

 $objReader = PHPExcel_IOFactory::createReader('Excel2007'); $objReader->setReadDataOnly(true); $objPHPExcel = $objReader->load("test.xlsx"); 

Этого достаточно кода достаточно

В этом сообщении рассказывается о том, как закрыть PHPExcel-ридер: как закрыть файл excel в php-excel-reader. Если вы открываете несколько файлов Excel одновременно, но на самом деле им не нужны в одно и то же время, тогда вы можете попытаться открыть и закрыть (т.е. отключить) считыватели для каждого файла один за другим. Btw, используя одно и то же имя переменной для читателей, было бы достаточно для операции «сбрасывания».