Статьи

Потребность в скорости: профилирование PHP с помощью XHProf и XHGui

Хотя терпение является добродетелью, оно обычно не присуще современному обществу, когда дело доходит до ожидания загрузки веб-страниц . Исследования, проводимые известными технологическими компаниями, такими как Google, Microsoft и Yahoo! показали, что даже разница во времени загрузки страницы может составлять менее секунды. Если этого недостаточно, Google включил время загрузки страницы в свои поисковые рейтинги еще в апреле 2010 года, что также влияет на SEO.

На загрузку страницы может влиять ряд факторов: задержка сети, конфигурация или загрузка веб-сервера, использование постоянного хранилища, кэширование или его отсутствие, а также время отклика приложения. В общем, время отклика приложения следует подозревать и учитывать последним, поскольку оно менее распространено, чем серверы баз данных или обработка статических активов, а попытки настроить его обычно имеют более низкую рентабельность инвестиций. Тем не менее, знание того, как находить проблемы, влияющие на производительность приложения — часто называемые узкими местами, — это хороший навык, который вам когда-либо понадобится.

Профилирование — это процесс измерения времени выполнения каждой функции или вызова метода, участвующего в обслуживании запроса одной страницы. Данные, собранные в результате этого процесса, могут выявить проблемы, такие как конкретный метод, выполнение которого занимает много времени, или его вызов много раз.

Профилирование сценария PHP обычно требует установки расширения PHP. Два более популярных расширения для этой цели — Xdebug Дерика Ретанса и XHProf Facebook. Эта статья будет посвящена XHProf.

Установка XHProf

XHProf доступен через PECL, поэтому его установка довольно проста. Например, он может быть установлен со следующими системами Debian:

  sudo pecl установить xhprof-beta
 echo 'extension = xhprof.so' |  sudo tee /etc/php5/conf.d/xhprof.ini> / dev / null
 перезагрузка sudo apachectl 

Необработанные данные профилирования, сгенерированные XHProf, нелегко сразу понять. Также, интерфейс или визуализация некоторого вида могут быть полезны для просмотра. XHGui , вилка XHProf, обеспечивает это.

XHGui размещается на GitHub, поэтому у вас есть два варианта установки. Первый вариант предполагает использование git для клонирования репозитория, что обеспечивает простой способ обновить его позже.

  git clone git: //github.com/preinheimer/xhprof.git 

Если вы предпочитаете не использовать git, второй вариант — просто загрузить и распаковать архив, отражающий текущее состояние хранилища, например:

  wget -O xhgui.tar.gz https://github.com/preinheimer/xhprof/tarball/master && tar -zxf xhgui.tar.gz 

На этом этапе вы можете использовать указания в файле INSTALL xhprof_htmlindex.php

SQL для создания таблицы базы данных, используемой для хранения данных профилирования, находится в блоках комментариев в верхней части файлов PHP в xhprof_lib/utils/Db Используйте файл, подходящий для сервера базы данных вашей среды, чтобы создать эту таблицу базы данных, затем добавьте учетные данные для доступа к нему в файл config.php

Если ваш веб-сервер не работает на вашем локальном хосте, не забудьте добавить IP-адрес вашего локального хоста в переменную $controlIPsconfig.php

Как только все это будет сделано, XHGui должен успешно загрузиться, когда вы перейдете к нему.

Для получения дополнительной информации о других настройках конфигурации, предлагаемых XHGui, см. Сообщение в блоге PHP Advent, ссылка на которое приведена в нижней части файла INSTALL

Если вы работаете с XHGui в среде разработки, одно место, где вы можете немного отличаться от инструкций, — это директивы для настройки параметра конфигурации auto_prepend_file Согласно руководству по PHP , этот параметр настраивается для каждого каталога, то есть вы можете использовать файл .htaccess Пример этого показан ниже.

  php_value auto_prepend_file "../../xhprof/external/header.php" 

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

Профилирование вашего приложения

Для целей этой статьи в качестве объекта профилирования используется пример скелетного приложения, предоставленного для использования с Zend Framework 2. Приведенный выше файл .htaccess Чтобы включить профилирование для определенного URL, добавьте _profile=1 Например, среда, используемая в этой статье, использует имя хоста zf2.localhttp://zf2.local/?_profile=1 Это установит cookie и затем перенаправит обратно в приложение с удаленной переменной строки запроса; при наличии файла cookie вам не нужно изменять строку запроса, чтобы включить профилирование для последующих запросов.

Как только запрос приложения будет выполнен, данные профилирования будут сохранены в базе данных, которую вы сконфигурировали для использования XHGui. Просто обновите интерфейс XHGui, и его сетка данных перечислит новый прогон профилирования в верхней части. Сетка данных также имеет ссылки для легкой фильтрации прогонов по периоду времени, использованию памяти, времени выполнения, серверу и домену.

Нажмите отметку времени, указанную для запуска, и XHGui отобразит страницу с подробными данными, собранными во время этого запуска. Таблица в верхнем левом углу отображает агрегированную статистику, такую ​​как общее время выполнения, использование памяти и количество вызовов функций. В правом верхнем углу показаны таблицы данных GET, POST и cookie, а также круговая диаграмма с подробным описанием дорогостоящих вызовов функций, выполняемых во время запроса.

Прокрутите вниз, и вы найдете список функций сетки данных и их соответствующую статистику. Если вы выполняете профилирование для времени выполнения, два столбца, на которых вы обычно хотите сосредоточиться, обозначены «Эксклюзивное время стены» и «Счетчик вызовов». Для использования памяти посмотрите столбцы «Эксклюзивное использование памяти» и «Эксклюзивный пик». Использование памяти. Нажмите на любой столбец сетки, чтобы отсортировать данные сетки по этому столбцу. Нажмите на имя отдельной функции, чтобы просмотреть страницу сведений, которая включает статистику этой функции, а также статистику ее родительских функций (т.е. функций, которые ее вызывают) и дочерних функций (то есть функций, которые она вызывает).

Сравнение прогонов профилирования

Обычный вариант использования профилирования — профилировать приложение, вносить изменения в исходный код этого приложения, а затем снова профилировать его, чтобы увидеть, как производительность повлияет на внесенные изменения. XHProf и XHGui были разработаны, чтобы сделать это довольно легко.

В XHGui, в сетке данных для профилированных прогонов, каждый прогон имеет значение хеш-функции, отображаемое под его отметкой времени. Выберите один из двух прогонов, которые вы хотите сравнить, и скопируйте его значение хеш-функции. Нажмите метку времени другого прогона, чтобы открыть страницу с подробностями. Наконец, в нижней части таблицы данных в левом верхнем углу введите значение хеша в текстовое поле с надписью «Выполнить дельта» и нажмите кнопку «Дельта» рядом с ним.

При этом отобразится страница, на которой прогон, для которого вы ввели значение хеш-функции, помечен «Прогон два», а прогон, для которого вы просмотрели страницу сведений, помечен «Прогон один». Как и страница подробностей, он отображает как совокупную статистику, так и статистику по данным. вызов функции. Эти статистические данные о вызовах функций вычисляются путем вычитания данных для прогона 1 из данных для прогона 2. Например, значение столбца «Время стены» для строки функции main () в таблице статистики функций соответствует разнице значений «Вкл. Wall Time »для прогона два и прогона один в таблицах агрегированной статистики.

Вполне возможно, что вы можете профилировать приложение дважды без внесения каких-либо изменений и увидеть значительную разницу в двух профилях. Одной из возможных причин этого является то, что PHP поддерживает свой собственный кэш статистики поиска файловой системы для повышения производительности. Чтобы уменьшить это различие в прогонах профилирования xhprof, добавьте вызов функции clearstatcache вверху external / header.php в вашей установке XHGui.

Просмотр Callgraphs

Еще одна особенность, предлагаемая XHGui, — это создание графов вызовов, ориентированных графов, которые показывают вызовы между функциями и визуально выделяют вызовы функций, которые занимают большое количество времени выполнения. Для этого XHGui отправляет утилиту dot graphviz . Ниже приведена команда для установки пакета для этого в системах на основе Debian:

  sudo apt-get установить graphviz 

Обратите внимание, что вам также нужно раскомментировать блок, который выглядит как приведенный ниже в файле config.php file Спасибо за сообщение в блоге Лорны Джейн Митчелл .

 <?php
//These are good for linux and its derivatives.
$_xhprof['dot_binary']  = '/usr/bin/dot';
$_xhprof['dot_tempdir'] = '/tmp';
$_xhprof['dot_errfile'] = '/tmp/xh_dot.err';

В верхней части страницы сведений об отдельном прогоне или о разнице между двумя прогонами вы найдете ссылку «Просмотр графика вызовов». Нажав на нее, вы получите график звонков, похожий на тот, который показан ниже. Обратите внимание, что это может занять некоторое время для запуска профиля с большим количеством вызовов функций. Вы также можете щелкнуть по названию отдельной функции и щелкнуть ссылку «Просмотр списка вызовов» на странице сведений, чтобы просмотреть список вызовов, относящийся к этой функции.

В заключение

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

Изображение через Fotolia