Имейте кучу дампа PHP на исключении OutOfMemory - PullRequest
3 голосов
/ 25 октября 2010

В настоящее время я отлаживаю скрипт, который постоянно сталкивается с исключениями OutOfMemory.Он запускается как cronjob и обычно работает нормально, но когда cronjob некоторое время не запускался (по какой-либо причине), сценарий должен обрабатывать множество элементов, которые поставлены в очередь и встретятся с исключением OutOfMemory.

Из изучения кода я не смог определить проблему.Я считаю, что один из итеративных вызовов функций может привести к утечке памяти, но я не уверен, какой и где.Есть ли возможность заставить PHP сбросить кучу, когда возникает исключение OutOfMemory?Я мог бы определить проблему оттуда (скорее всего).

Ответы [ 6 ]

5 голосов
/ 10 ноября 2010

Хотя мне не удалось найти параметр «куча дампа при исключении», я все же нашел get_defined_vars(), который по сути является дампом кучи, если вызывается из глобальной области видимости. Используя это, я смог увидеть, что там, где сотни (на самом деле тысячи) по-прежнему ссылающихся строк базы данных остаются в моей памяти. Это произошло из-за неосвобожденного ресурса результата mysql где-то в печально известной функции, вызвавшей утечку. Я нашел это и исправил это. Теперь он работает хорошо.

1 голос
/ 25 октября 2010

Что ж, проще всего было бы использовать блок try-catch вокруг той части вашего скрипта, где возможно возникновение ошибки, и вам придется сбросить стек в части catch.Проблема может заключаться в том, что машина не сможет среагировать, потому что память заполнена, и она заканчивается.Я не знаю, помогает ли это отбрасывать некоторые переменные, чтобы освободить некоторую память для вывода некоторых данных.

EDIT : для этой цели используйте функцию php debug-backtrace .Это даст вам трассировку стека.Таким образом, обнаружение ошибки будет очень вероятным, если машина все еще работает.

0 голосов
/ 26 апреля 2015

Я никогда не видел, чтобы PHP предоставлял собственные средства для этого, но может существовать несколько других вещей:

Попробуйте: https://github.com/mcfunley/php-heap/blob/master/php-heap.py

Можно также написать расширение для достижения того же.

0 голосов
/ 23 марта 2014

Это так же хорошо, как «куча дамп», как я могу быстро написать на PHP.Я беру определенные переменные и функции, затем сортирую по их сериализованной длине.Сериализованная длина не является 100% надежным методом получения размера переменной, но она довольно хороша и, как правило, полезна для определения того, какие объекты являются вашими бредами в памяти:хотите немного изменить функцию обратного вызова, если вы хотите, чтобы ваши результаты были более подробными, или проходить через определенные переменные.

0 голосов
/ 25 октября 2010

У меня было много проблем с simpleXML и утечками памяти. Они - боль в том, чтобы отследить ... у меня ушло несколько дней, чтобы выяснить, что вызвал simpleXML, а затем исправить их. Насколько я знаю, вы, канд, программно установили обработчик для OOM:)

Кроме того, функции PHP для отображения информации о памяти не могут обнаружить утечки памяти, у меня было скриптов, потребляющих ~ 1 ГБ оперативной памяти, но функции PHP сообщили об использовании только 100 МБ :)

0 голосов
/ 25 октября 2010

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

...