Статьи

Профилирование PHP-приложения

При разработке веб-приложений мы часто сталкиваемся с проблемами производительности. Люди часто обвиняют PHP или MySQL в плохой производительности, но в большинстве случаев ответ не так прост. Слепая попытка оптимизировать случайные части наших приложений может привести к некоторым неравномерным результатам.

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

Этот пост описывает установку и настройку некоторых из них. Я проверил их в виртуальной машине Ubuntu 10.10. Если вы хотите попробовать эти инструменты, не забывайте, что они могут сильно повлиять на производительность вашего веб-сервера, когда они активны. Установка такого инструмента, как Xdebug, на производственный сервер не рекомендуется.

Оцените вашу заявку

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

Установить Siege довольно просто, скачайте его, распакуйте и скомпилируйте с помощью make.

tar -xvf siege-latest.tar.gz
cd siege-2.70/
./configure
make
sudo make install
siege.config

Запуск siege.config сгенерирует файл .siegerc. Возможно, вам придется отредактировать его и изменить место создания файла журнала. По умолчанию журналы хранятся в /var/siege.log, и я не хочу запускать их как root. Поэтому я раскомментировал строку журнала, чтобы сохранить ее в своей домашней папке. Возможно, вы также захотите установить для verbose значение false.

Когда Siege установлен, вы можете использовать следующую команду, чтобы выполнить ее в течение 30 секунд с 5 одновременными подключениями.

siege -c 5 -b -t30s http://localhost
** SIEGE 2.70
** Preparing 5 concurrent users for battle.
The server is now under siege...
Lifting the server siege.. done.
Transactions: 143 hits
Availability: 100.00 %
Elapsed time: 29.75 secs
Data transferred: 0.27 MB
Response time: 1.02 secs
Transaction rate: 4.81 trans/sec
Throughput: 0.01 MB/sec
Concurrency: 4.92
Successful transactions: 143
Failed transactions: 0
Longest transaction: 1.54
Shortest transaction: 0.94

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

Xdebug

Xdebug — это отладчик для PHP. Я уже говорил об этом в своем посте об отладке PHP в Eclipse . Он также может быть использован для профилирования. Вы можете установить его с помощью Apt.

sudo apt-get install php5-xdebug

Чтобы настроить его, откройте ini-файл Xdebug, в стандартной Ubuntu он находится в /etc/php5/conf.d/xdebug.ini. Добавьте эти строки:

xdebug.default_enable=1
xdebug.scream=1
xdebug.profiler_enable=1
xdebug.profiler_output_dir=/tmp/xdebug

Это гарантирует, что Xdebug добавит трассировку стека к ошибкам. А опция scream отключит оператор контроля ошибок PHP (@). Таким образом, все ошибки будут отображаться. Он включает профилировщик и меняет его выходную папку. Убедитесь, что папка завершена, и что Apache может писать в нее.

Когда Xdebug установлен и настроен, перезапустите Apache и перейдите к своему веб-приложению. Xdebug создаст несколько файлов в выбранной вами папке. Затем вы можете использовать KCachegrind для просмотра этих файлов. Вы можете установить его с помощью этой команды:

sudo apt-get install kcachegrind

На машине Gnome это установит множество зависимостей. Но после этого вы сможете открыть выходной файл из Xdebug. Вы должны получить окно, которое выглядит так:

KCachegrind

Вывод KCachegrind

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

Если вы предпочитаете веб-интерфейс, вы можете использовать Webgrind для проверки результатов Xdebug.

XHProf

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

Чтобы установить его, загрузите последнюю версию и выполните следующие команды:

tar -xvf xhprof-0.9.2.tgz
cd xhprof-0.9.2/extension/
phpize
./configure --with-php-config=/usr/bin/php-config5
make
make test
sudo make install

Отредактируйте свой php.ini и добавьте эти строки в конце:

[xhprof]
extension=xhprof.so
;
; directory used by default implementation of the iXHProfRuns
; interface (namely, the XHProfRuns_Default class) for storing
; XHProf runs.
;
xhprof.output_dir=/tmp/xhprof

Обязательно измените выходной каталог на что-то подходящее на вашей машине.

Чтобы профилировать ваше приложение, теперь вам нужно добавить некоторый код в начале и в конце выполнения вашей страницы. Добавьте это в начале:

xhprof_enable();

И это в конце:

$data = xhprof_disable();

$XHPROF_ROOT = '/home/testing/Downloads/xhprof-0.9.2';
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";

$xhprof_runs = new XHProfRuns_Default();

// Save the run under a namespace "xhprof".
$run_id = $xhprof_runs->save_run($data, "xhprof");

XHGui

XHGui — это инструмент, который позволяет сохранять данные из XHProf в базе данных и отображать их в приятном пользовательском интерфейсе. Он также поставляется с двумя файлами, которые облегчают добавление XHProf в ваш silte. Чтобы установить его, клонируйте репозиторий из GitHub. И следуйте инструкциям в файле INSTALL. Вот инструкции для машины, использующей MySQL для хранения.

git clone https://github.com/preinheimer/xhprof.git
cd xhprof
ln -s xhprof_lib/utils/xhprof_runs_mysql.php xhprof_runs.php
mv xhprof_lib/config.sample.php xhprof_lib/config.php

Посмотрите в файле xhprof_runs.php. Есть запрос на создание таблицы. Создайте базу данных для XHGui и выполните запрос. Отредактируйте файл xhprof_lib / config.php и введите информацию для своей системы. Не забудьте установить для doprofile значение true. Кроме того, вам нужно раскомментировать один из разделов для путей, куда XHGui должен поместить свои файлы. Существуют значения по умолчанию для Windows и Linux.

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

php_admin_value auto_prepend_file "/home/testing/Downloads/xhprof/external/header.php"
php_admin_value auto_append_file "/home/testing/Downloads/xhprof/external/footer.php"

You will also need to create a virtual host for XHGui. Then after your site have been visited a few times, you can navigate to you XHGui installation and you will have a page that list the last 25 runs of your sites. Pick one and you should see a page like this one.

XHGui Run page

From this page you can view a lot of information about your pages. It contains statistics about the time the page took, the CPU and memory usage and the number of functions calls. At the bottom, there is a list of functions with the same information. It makes it easy for you to see where the page takes the most time or resources. This will help you find targets for optimizations that will really impact the use experience on your site or the machine where it runs. You can click on any function and view a break down of the functions it calls.

On the main page of a run and in the functions pages, you can generate a call graph with just on click.
График вызовов XHGui
It gives you a nice visual of the functions called when you display a page. The functions that can be problematics are in red or yellow, so you can spot the easily.

This Is Just The Beginning

This is only an introduction to some of the tools that are available for PHP developers. I want to play more with them, and maybe post more information when I get more familiar with them. If you don’t do any profiling, you should probably try them too.

One important rule when optimizing, always measure. Benchmark before and after every change to make sure you are going in the right direction.

Update 2011-04-01

php|architect announced yesterday their first Annual Impact Awards. They nominated quite a few amazing projects, the choices are not easy. However, I think XDebug is an outstanding tool that impact the work of many PHP developers every day. Derick Rethans is doing some important work with it. He has my vote for the award. If you are a php| architect subscriber, go cast your vote.