Профилирование памяти PHP

Какой хороший способ профилировать использование памяти страницы PHP? Например, чтобы узнать, сколько памяти использует мои данные, и/или какие вызовы функций выделяют большую часть памяти.

  • xdebug, похоже, не предоставляет информацию о памяти в своей функции профилирования.

  • xdebug делает, предоставляя его в своей функции трассировки. Это очень близко к тому, что я хочу, за исключением того, что огромное количество данных является подавляющим, поскольку оно отображает дельта памяти для каждого вызова функции. Если бы можно было скрывать вызовы ниже определенной глубины, возможно, с помощью некоторого инструмента GUI, который бы разрешил мою проблему.

Есть ли что-нибудь еще?

Ответ 1

Как вы, наверное, знаете, Xdebug отказался от поддержки профилирования памяти с версии 2. *. Пожалуйста, найдите здесь строку "удаленные функции": http://www.xdebug.org/updates.php

Удаленные функции

Удалена поддержка профилирования памяти, так как это не работает должным образом.

Итак, я пробовал другой инструмент, и он работал хорошо для меня.

https://github.com/arnaud-lb/php-memory-profiler

Это то, что я сделал на своем сервере Ubuntu, чтобы включить его:

sudo apt-get install libjudy-dev libjudydebian1
sudo pecl install memprof
echo "extension=memprof.so" > /etc/php5/mods-available/memprof.ini
sudo php5enmod memprof
service apache2 restart

И затем в моем коде:

<?php

memprof_enable();

// do your stuff

memprof_dump_callgrind(fopen("/tmp/callgrind.out", "w"));

Наконец откройте файл callgrind.out с помощью KCachegrind

Использование Google gperftools (рекомендуется!)

Прежде всего установите Google gperftools, загрузив последний пакет здесь: https://code.google.com/p/gperftools/

Тогда, как всегда:

sudo apt-get update
sudo apt-get install libunwind-dev -y
./configure
make
make install

Теперь в вашем коде:

memprof_enable();

// do your magic

memprof_dump_pprof(fopen("/tmp/profile.heap", "w"));

Затем откройте терминал и запустите:

pprof --web /tmp/profile.heap

pprof создаст новое окно в вашем существующем сеансе браузера, как показано ниже:

PHP memory profiling with memprof and gperftools

Xhprof + Xhgui (лучший, на мой взгляд, профиль как процессора, так и памяти)

С помощью Xhprof и Xhgui вы можете также профилировать использование процессора или просто использовать память, если это ваша проблема на данный момент. Это очень полные решения, они дают вам полный контроль, и журналы могут быть написаны как на mongo, так и в файловой системе.

Подробнее... см. мой ответ здесь.

Blackfire

Blackfire - это профилировщик PHP SensioLabs, ребята Symfony2 https://blackfire.io/

Если вы используете puphpet для настройки своей виртуальной машины, вы будете рады узнать, что она поддерживается; -)

Ответ 2

Ну, это может быть не совсем то, что вы ищете, но PHP имеет несколько встроенных функций, которые будут выводить использование памяти. Если вы просто хотели узнать, сколько памяти использует вызов функции, вы можете использовать memory_get_peak_usage() до и после вызова и учитывать разницу.

Вы используете ту же технику вокруг своих данных, используя очень похожий memory_get_usage().

Довольно простой подход, но это быстрый способ проверить часть кода. Я согласен с тем, что xdebug mem deltas может быть слишком многословным, чтобы быть полезным иногда, поэтому я часто просто использую его, чтобы сузить до раздела кода, а затем выгрузить конкретное использование памяти для небольших фрагментов вручную.

Ответ 3

http://geek.michaelgrace.org/2012/04/tracing-php-memory-usage-using-xdebug-and-mamp-on-mac/

Я нахожусь на Mac, поэтому, если вы в Windows, вам придется протестировать это, но это работает для меня.

Я изменил файл tracefile-analyzer.php и добавил путь к двоичному файлу PHP сверху, чтобы вы могли называть его в терминале как обычный unix script.

#!/Applications/MAMP/bin/php5.3/bin/php
<?php
if ( $argc <= 1 || $argc > 4 )
{

Не забудьте сделать chmod этот файл до 755.

Вы можете легко создать ruby ​​watchr script, чтобы автоматически вызывать script каждый раз, когда он создает файл профиля памяти (*.xt). Таким образом, вы можете продолжить тестирование и увидеть свои улучшения, не выполняя команду снова и снова.