Twitt
@Twitt

Как PHP работает с ОЗУ?

Allowed Memory Size of ******** Bytes Exhausted

Отдается мне когда я из бд по 1000 записей (из 100к) выбираю и записываю в Excel с помощью PHPExcel библиотеки.
Вопрос: как утекает память? Запрос типа: получил 1000 записей, в цикле обошел все 1000 записей, записал их. Получил еще 1000 - записал в цикле еще 1000. (При этом файл всё это время открыт, и закрывается только после окончания записи).
Вопрос: как избежать такого? Может делать unset каждой записанной переменной в цикле? И что именно влияет на память?
  • Вопрос задан
  • 213 просмотров
Пригласить эксперта
Ответы на вопрос 3
index0h
@index0h
PHP, Golang. https://github.com/index0h
Имеет смысл явно дергать gc_collect_cycles в конце обработки каждой пачки данных, так как GC может запуститься слишком поздно.
Для исследования куда утекает - xhprof
Ответ написан
Комментировать
@egormmm
Борітеся — поборете!
1. Не извлекать все записи из бд в переменную, а подготавливать запрос, и последовательно пройтись по строкам.
2. Использовать другую библиотеку для работы с Excel.
Ответ написан
Комментировать
skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.
Попробуйте использовать генератор для обработки данных. Тогда не придётся всё в памяти держать. И смотрите чтобы вынимаемые данные не утекали никуда. Помните, что объекты передаются по ссылке и если существуют в двух переменных - при unset одной не удаляются из второй.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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