Задать вопрос

Как ускорить создание большого прайса?

День добрый, создаю прайс xlsx из базы данных mysql с помощью библиотеки PhpSpreadsheet, прайс после создания отправляется клиентам, каждому клиенту свой прайс с разными позициями и ценами (все делаю запросом в mysql и применяется php для создание цен), в каждом прайсе порядка 300 тыс позиций. Задание запускает cron по расписанию

Вопрос такой, прайс создается порядка +-40 мин, как возможно ускорить создание прайса?
Так же применяется Memcache, но у него всего 1 гиг, этого не хватает (максимум на хостинге)
  • Вопрос задан
  • 1629 просмотров
Подписаться 5 Простой 9 комментариев
Решения вопроса 1
antoo
@antoo
40 минут - звучит совсем дико, необходимо профайлить и понимать, что именно выполняется так долго.

PhpSpreadsheet скоростью никогда не отличался, особенно для больших файлов, рекомендую перейти как минимум на https://github.com/box/spout . Недавно ещё была интересная статья на хабре про генерацию больших и сложных Excel, ознакомьтесь: https://habr.com/post/422059/
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 6
@ponaehal
ИМХО, общий подход (вне зависимости от используемой библиотеки):
Почти любая библиотека может заполнять одну ячейку, а может диапазон.
Нужно сформировать диапазон (диапазоны) в БД, а потом залить его в эксель одной (несколькими) операцией.
По опыту, на больших файлах это даст прирост производительности на несколько порядков
Ответ написан
@ewb
Из базы в CSV, а там его можно и прямо экселем открыть и смотреть точно так же (как обычный экселевский файл) или же делать уже, что-то с готовым файлом (конвертировать).
Так как CSV просто текст, то генерация должна пройти быстро.
Ответ написан
dmitriylanets
@dmitriylanets
веб-разработчик
Как вариант сформировать csv а в нужный формат перегнать утилитой например libraoffice
Ответ написан
Комментировать
@marsdenden
Есть еще интересный хак - сформировать html с < table >< / table >, сохранить его как xls - любой excel открывает такой файл, не чихая. Правда, на таких объемах я это не тестировал.
Ответ написан
Randel
@Randel
Developer
И ещё один хак существует.

Рассматривать XLSX как zip-архив набора XML файлов, чем он по сути и является.

PHP довольно неплохо ворочает XML, в отличие от XLSX.

Но это довольно муторно, придётся разбирать методику как формируется всё это дело. Но может показаться интересным.
Ответ написан
Комментировать
@smoln Автор вопроса
Наконец то добрался! Спасибо всем за обсуждение, отметил решение данного вопроса, может кому пригодится. Создание прайса 300 тыс строк (17мб ) теперь занимает две минуты! Решение в библиотеке https://github.com/box/spout
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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