2009-10-15 4 views
0

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

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

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

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

Так что мои вопросы:

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

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

ответ

2

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

  1. профиль скрипт с Xdebug + WinCacheGrind (или какой-либо другой профилировщика) и/или FirePHP.
  2. Включите режим STRICT, чтобы получить все уведомления об ошибках php +.

Делая это, вы будете иметь возможность:

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

Объектная модель полностью изменилась с PHP4 на PHP5. Конечно, режим STRICT скажет вам, что вы не должны использовать явный «пройденный по ссылке».

0

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

2

Один общий, который я нашел в одном выпуске 5.2, заключался в том, что strtotime просочился без памяти_get_usage, поймав его. Исправлена ​​проблема с strptime.

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

 Смежные вопросы

  • Нет связанных вопросов^_^