Появилась задача распарсить и добавить в базу данных прайс-лист в формате Excel. Задача в общем виде простая — для этого есть PHPExcel. Проблемы как обычно возникают в отдельно взятых случаях. В данном случае проблема оказалась в большом размере файла xls — примерно 11 Мб.
Есть следующий код:
$inputFileType = PHPExcel_IOFactory::identify($file); $objReader = $objReader = PHPExcel_IOFactory::createReader($inputFileType); $objPHPExcel = $objReader->load($file);
Для файла он потребляет в пике около 270 Мб оперативной памяти, что не очень приемлимо для виртуального хостинга. В результате на хостинге скрипт не работает — возникает ошибка «Out of memory»
Так как файл нужен только для чтения, то добавим опцию
$objReader->setReadDataOnly(true);
Потребление оперативной памяти при этом снизилось до 197 Мб. Уже неплохой результат. Для его улучшения добавим кеширование данных файла.
PHPExcel_Settings::setCacheStorageMethod(PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip);
Это снизило быстродействие скрипта, но в данном случае это не критично. Главное вписатья в рамки потребления памяти.
В библиотеке PHPExcel есть несколько вариантов кеширования. Данный вариант был выбран опытным путем — как компромисс между требованиям к памяти и возможностями хостинга.
В результате код стал следующим.
PHPExcel_Settings::setCacheStorageMethod(PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip); $inputFileType = PHPExcel_IOFactory::identify($file); $objReader = $objReader = PHPExcel_IOFactory::createReader($inputFileType); $objReader->setReadDataOnly(true); $objPHPExcel = $objReader->load($file);
А памяти, для того же самого файла, он стал потреблять 131 Мб., т.е. в два раза меньше чем первоначальный.
Очень неплохой результат, как мне кажется.