Утечка памяти при переходе с PHP 4 на 5 - есть какие-нибудь подсказки?

StackOverflow https://stackoverflow.com/questions/1572047

Вопрос

Я портирую большое веб-приложение в общую среду веб-хостинга.Приложение было написано на PHP 4.Новая среда имеет PHP 5.2.

По какой-то причине приложение пропускает огромные объемы памяти при запуске в PHP 5.2.Я могу буквально наблюдать, как использование памяти зашкаливает, используя memory_get_usage(), пока оно не достигнет предела в 64 МБ (что очень щедро в общей среде, сайт раньше работал с 12 или 16 МБ на PHP 4).

Я подозреваю, что это побочный эффект чего-то, что изменилось в PHP 5, скорее всего, обработки ссылок на объекты в аргументах.Однако поиск конкретного поведения, которое вызывает утечку, чрезвычайно сложен, поскольку приложение очень сложное и частично не очень хорошо написано (да, это мое).

Поскольку приложение установлено в общем веб-пространстве, я не могу использовать классические средства отладки (насколько я знаю).Мне бы очень, очень хотелось избежать воссоздания среды локально, поскольку я работаю над проектом буквально весь день в течение некоторого времени.

Итак, мои вопросы таковы:

  • Кто-нибудь знает типичные ошибки перехода PHP4 => 5, особенно при работе с большим количеством объектов, которые могут быть причиной моих утечек

  • Кто-нибудь знает какой-нибудь независимый от отладчика инструмент "дамп графической области видимости" только для скриптов для переменных, используемых PHP, который мог бы помочь мне выяснить, какие переменные поглощают эти огромные объемы памяти?

Это было полезно?

Решение

Чтобы решить эту проблему, я бы:

  1. Профилируйте скрипт с помощью xdebug + wincachegrind (или какого-либо другого профилировщика) и / или firephp.
  2. Включите СТРОГИЙ режим, чтобы получать все уведомления об ошибках php +.

Делая это, вы сможете:

  • Оптимизируйте свой код.(Удаление ошибок / предупреждений / уведомлений может ускорить ваш код)
  • Очистите свой код.(Использование правильного синтаксиса объекта php5 может быть полезно только для повышения производительности).

Объектная модель полностью изменилась с PHP4 на PHP5.Наверняка, СТРОГИЙ режим подскажет вам, что вам не следует использовать явное "передается по ссылке".

Другие советы

Одна из распространенных ошибок, которую я обнаружил в одном выпуске 5.2, заключалась в том, что утечка strtotime произошла без того, чтобы memory_get_usage ее перехватил.Переход на strptime устранил проблему.

Для этого есть отчет об ошибке для версии 5.2.8 - http://bugs.php.net/bug.php?id=46889.

Без отладчика вы можете открыть скрипт, который, по вашему мнению, использует много памяти, и поместить функцию memory_get_usage в критические локальные.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top