Профилирование памяти 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). Таким образом, вы можете продолжить тестирование и увидеть свои улучшения, не выполняя команду снова и снова.