Xpoint
   [напомнить пароль]

Оптимизация потребления памяти скриптом

Метки: [без меток]
2008-12-08 15:20:12 [обр] Alek$[досье]

Задача такая: есть большой скрипт (форум с галереей). Памяти он потребляет от 4 до 6 мб на страницу. Необходимо это число сократить до приемлемых размеров.

Есть ли какой-то способ определить, что именно занимает память, какие переменные или ресурсы? Пока не придумал ничего лучшего, чем с помощью get_defined_vars() получить список переменных и пересмотреть их, но особого результата это не дало - общий размер полученных таким образом переменных значительно меньше потребляемой памяти.

Пересматривать и анализировать весь код вручную тоже не представляется возможным - это там около 3 Мб.

спустя 9 минут [обр] Алексей Севрюков(162/1280)[досье]
Alek$[досье] Для начала попробуйте запустить пустой скрипт PHP, с задержкой и посмотрите сколько он ест. Может быть Вас это натолкнет на определенные мысли.
спустя 25 минут [обр] Alek$[досье]

Алексей Севрюков[досье] пустой скрипт потребляет 262144 байт. Задержка тут не к чему, поскольку информация получается при помощи memory_get_usage():

<?php
echo memory_get_usage(true);
?>

спустя 31 минуту [обр] Алексей Севрюков(162/1280)[досье]
Alek$[досье] Хм, маловато что-то. А если лист процессов посмотреть, там сколько получается?
спустя 19 минут [обр] Ali(5/5)[досье]

Как найти корень "зла"... Можно поставить xdebug и посмотреть в профайлере стек вызовов и соответствующий расход памяти, выделить наиболее прожорливые файлы/функции и дальше смотреть по тексту...
К примеру, можно получать данные из mysql не пакетом, а по одной (через небуферизированные запросы, что экономит память).

p.s. memory_get_usage дает текущий расход памяти. Если у вас PHP5.2.x, можно получить пиковый расход через вызов memory_get_peak_usage

спустя 18 минут [обр] Alek$[досье]

Алексей Севрюков[досье] Почему маловато? Для пустого скрипта это как раз нормально. То, что я увижу в списке процессов адекватной оценкой не будет, поскольку там будет учтена память, использованная apache и т.д. Меня же интересует использование памяти php скриптом и то, как найти наиболее прожорливые места.

Ali[досье] Сейчас как раз пытаюсь заставить XDebug работать. Огорчает то, что он не может работать с ZendOptimizer, который мне нужен для других дел. Возможно, есть совместимые отладчики?

PS. Я знаю про это функцию. Ее показатели тоже неутешительны.

спустя 1 час 37 минут [обр] Александр Галкин(112/211)[досье]
Можно попробовать вручную сделать профайл с помощью конструкции declare.
спустя 1 час 9 минут [обр] Alek$[досье]
Александр Галкин[досье] спасибо, интересная конструкция. Надо будет разобраться с нею поподробнее.
спустя 14 минут [обр] Ali(5/5)[досье]
Alek$[досье] Это да, но xDebug нужен только на время профайлинга. Сделай профайл, потом включай optimizer. Либо вообще профилировать на другом сервере.
Я лично вообще eAccelerator использую, никаких зендов :), а профилирую на другом сервере, если нужно...
спустя 19 часов [обр] Alek$[досье]
Ali[досье] Так и поступлю. А зенд мне нужен для запуска определенного софта, но это уже другая тема.
спустя 1 день 19 часов [обр] Андрей(2/2)[досье]
Alek$[досье], Вы пишите, что ваш собственный код занимает около 3 Мб. Есть такой вариант: вначале вы отключаете всё (пустой скрипт), затем добавляете кусок, затем другой кусок. Возможно, вместо каких-то функций ставите временные заглушки и т.д. Смысл в том, что Вы постепенно увеличиваете свой PHP-код с 0 б до 3 Мб и постоянно отсматриваете, сколько стало использоваться оперативной памяти.
спустя 4 часа [обр] Alek$[досье]
Андрей[досье], я нигде не сказал, что это мой код. Это форум и куча модов, на него установленных. Код был написан совершенно другими людьми, а мне приходится эту монструозную систему оптимизировать. То решение, которое предложили Вы не подходит, поскольку там все взаимосвязано и порезать код на самодостаточные части еще сложнее, чем вручную его перелопатить на предмет потребления памяти.
Так что пока остановился на XDebug и его трейсе с указанием использования памяти.
Powered by POEM™ Engine Copyright © 2002-2005