Куда именно память утекает в PHP?

Наверняка все сталкивались с ошибкой типа Allowed memory size of XXX bytes exhausted (tried to allocate YYY bytes).

Кто может подсказать — есть ли какие-то способы быстро определить куда утекла память?

В какие переменные/свойства?



Можно ли просто и быстро получить список всех переменных с указанием объема занимаемого места?



В идеале хотелось бы конечно повесить это на callback ошибки, но можно и так прогнать в синтетических тестах.



Очень уж не хочется рефакторить ~7k строк чужого кода.



PHP 5.4.4-7
  • Вопрос задан
  • 3959 просмотров
Пригласить эксперта
Ответы на вопрос 9
Ar2r
@Ar2r
PHP разработчик
xdebug
Ответ написан
Комментировать
Stdit
@Stdit
или xhprof
Ответ написан
Комментировать
akalend
@akalend
программирую
в дополнение к вышесказанному есть memtrack php.net/manual/ru/book.memtrack.php
как показывает практика память утекает конструкции в циклах: while ( $row = mysql_fetch_row() ) { $myArr[] = $row; }
или в создании мега-крутых $superObject — который содержит в себе кучу разных объектов

и еще мы забываем или просто не знаем, что есть конструкция unset
Ответ написан
akalend
@akalend
программирую
>Очень уж не хочется рефакторить ~7k строк чужого кода.
мне тоже много чего не хочется…
а вот придется…

все утечки от плохой или слишком хорошей и очень правильной архитектуры
Ответ написан
Комментировать
standov
@standov
Почему вы считаете что память «утекает»? Может ее просто недостаточно. Все-же утекает это вполне конкретная проблема и симптомы о которых вы говорите ее не характеризуют.
Ответ написан
CodeByZen
@CodeByZen
php, js, my/mssql, sqlite, html, css, it-consult
Я конечно, могу ошибаться, и возможно меня заминусуют, но прежде чем ставить софт для дебага, стоит посмотреть в логи. В ошибке должен быть конкретный момент описан, где именно расходуется много памяти и соответственно где возникает ошибка.
Ответ написан
zenon
@zenon
Как-то столкнулся с ситуацией, когда в скрипте импорта огромного объема данных память «утекала неизвестно куда». В результате оказалось, что просто был включен лог SQL-запросов, который самым честным образом заполнялся и выедал весь выделенный объем.
Ответ написан
Комментировать
script88
@script88
Поставьте себе pinba, webgrind, они Вам все покажут и расскажу.
Ответ написан
Комментировать
CodeByZen
@CodeByZen
php, js, my/mssql, sqlite, html, css, it-consult
А что, если использовать такую конструкцию и вести свой лог с блекджеком и шлюхами ошибками?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы