bizzi
@bizzi
junior php web developer

Загрузка excel в базу mysql на laravel, как загрузить большой объем данных?

Есть сайт на ларавеле, заказчик просит добавить массовую загрузку данных в базу из эксель таблиц.
Попробовала прикрутить вот эту штуку www.maatwebsite.nl/laravel-excel/docs , тестирую с небольшим объемом данных(2 листа по 20 записей) - работает, пробую протестировать с большими данными (3 листа примерно по 100 записей) - дико виснет и требует все больше и больше памяти и времени. Пришла к тому, что добавила в php.ini memory_limit = 1024M и max_execution_time = 96000 и ушла в магазин.
Прихожу, вижу что браузер ничего уже не грузит, в логах апача PHP Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 72 bytes) in /var/www/html/instabasket/vendor/phpoffice/phpexcel/Classes/PHPExcel/Cell.php on line 583 ну и собственно все.
Проблема в том, что у заказчика эксели по 2000 записей содержат, а тут на 300 апач помирает.
Кто сталкивался с такой пробемой, какие есть решения?

Laravel Framework version 4.2.17
PHP 5.5.9-1ubuntu4.13 (cli)
Apache/2.4.7 (Ubuntu)
Ubuntu 14.04.3 LTS
  • Вопрос задан
  • 2268 просмотров
Пригласить эксперта
Ответы на вопрос 6
65536
@65536
Недавно к проекту, которым занимаюсь, заказывали у другого человека парсер, который на входе получал хлсх файлы, потом в порядке очереди сканировал каждый файл, лез на сайт жертву, парсил значения и создавал новый такой же файл с новыми значениями. Сначала он применил PHPExcel, естественно всё загибалось почти сразу же. Грузит в память целиком, и не высвобождает как его не ансетить и дестроить. С каждым файлом оперативки становится заметно меньше, файл на 5 мб превращается в 200 в памяти. В общем не прокатило и он прикрутил вот это https://github.com/box/spout

там все минимум кода считывается и никаких проблем с памятью. https://github.com/box/spout#reader

а так приходилось в TSV переводить и его построчно считывать, потому-что ни одной нормальной либы для экселя не было

если операция одноразовая можно лоад дата инфайл применить, как посоветовали
Ответ написан
Denormalization
@Denormalization
Работал с этим пакетом, не сталкивался с такой проблемой.

А файл принципиально должен быть в xls? Может просто сконвертировать его в csv, и простым fgetcsv читать построчно и писать в бд? Проще по-моему некуда.
Ответ написан
MaxDukov
@MaxDukov
впишусь в проект как SRE/DevOps.
присоединюсь к хору "за CSV". У мускуля есть замечательная команда LOAD DATA INFILE - к примеру, загрузка файла в 4,5 миллиона! строк занимает минуты.
при таком раскладе грузите файлик на сервер, дергаете xls2csv, потом дергаете LOAD DATA, указав путь к файлу - profit.

учтите, в убунте мускуль может читать не из всех каталогов! придется править apparmor, ну да это не проблема.
Ответ написан
Комментировать
@AVKor
Тут этот вопрос постоянно задают, только я на него отвечал уже раза два. В поиск отчего не обращаетесь?

XLS -> CSV -> LOAD DATA [LOCAL] INFILE
Ответ написан
Комментировать
bizzi
@bizzi Автор вопроса
junior php web developer
Ну собственно после конвертации в CSV все залилось как по маслу, да.
Всем спасибо господа!
Ответ написан
Комментировать
@lynnikvadim
xlsx грузится плохо. А вот xls - грузится без проблем.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы