Показать сообщение отдельно
Старый 08.12.2012, 05:47   #1
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Профайлинг с помощью xdebug

Иногда бывает, что ваш сайт тормозит, причём хрен разбери отчего (тяжкое "наследство", раздолбайство автора плугина для Вордпресса, или же последствия косяка проявились лишь через время после того, как сайт был запущен). Определиться с тем, какие куски кода сколько времени жрут, поможет профайлинг. Для профайлинга я предлагаю использовать xdebug.

Естественно, перво-наперво его надо установить. Рекомендации по установке зависят от ОС вашего сервера, нет смысла приводить их, just google it.

В Ubuntu-подобных дистрах достаточно для установки написать: apt-get install xdebug

К сожалению, мне повезло не столь сильно, и репозитории yum'а в моей CentOS о таком пакете не слыхали. Потыкавшись в вебе, я пришёл к выводу, что скомпилить из исходников будет быстрее (единственный способ, который работает ВСЕГДА). Вот инструкция, по которой я это делал.

Так или иначе, когда вы установили xdebug, нужно кое-что дописать в php.ini, который обычно лежит здесь: /etc/php.ini

В нём я добавил следующую строчку:
extension=xdebug.so
Теперь рестартаните ваш веб-сервер, у меня это делается так:
service httpd restart
Как вариант:
service apache2 restart
Теперь посмотрите на phpinfo. Создайте файлик php и в нём напишите:
<?php phpinfo(); ?>
А теперь зайдите на него. Должно отобразить таблицу с различными параметрами php. Если вы найдёте там блок xdebug, то это значит, что установился он успешно. Теперь давайте настроим профилирование.

Открываем снова php.ini и добавляем строку:
xdebug.profiler_output_dir = "/var/log/xdebugprofiler"
Тут всё понятно: сюда будут высираться результаты профайлинга, чтобы мы могли их достать и проанализировать. Помните: папка должна быть writeable, чтобы дебаггер смог туда что-то написать. Также помните, что результаты профайлинга весят прилично (десятки мегабайт, а, при умелом говнокоде, могут весить и сотни), так что следите, чтобы там, куда будут их писать, было свободное место. Ещё целесообразно указывать папку, к которой у вас есть ftp-доступ, чтобы вы могли без проблем скачать результаты к себе на рабочую машину для анализа.

Далее надо активировать сам профайлинг. Вообще, есть такой параметр:
xdebug.profiler_enable
Он активирует профайлинг во ВСЕХ исполнениях php, если выставить на единицу. Но я не рикаминдую это делать, особенно на live-сервере: ВСЕ запросы ВСЕХ юзеров обработаются профайлером. А нам ведь чаще всего надо проанализировать исполнение конкретного сайта или даже страницы.

Вместо него в php.ini пишем вот это:

xdebug.profiler_enable_trigger = 1
Это строка активирует профайлер, но только по запросу.А запрос такой: в GET или POST-запросе нужно передать спец. параметр DEBUG_PROFILE. Это послужит сигналом к тому, чтобы профайлер стал собирать данные.

Ну, давайте приступим. Проще всего передать этот параметр через GET:
www.mysite.ru/test.php?XDEBUG_PROFILE.

После того, как страница сгенерируется, отправляйтесь в папку, указанную в xdebug.profiler_output_dir и забирайте оттуда только что созданный файл к себе на рабочую машину.

Далее вам понадобится программа для анализа, ведь отчёт не очень человекопонятен. Для Винды есть программа WinCacheGrind. Делаете File - Open на ваш отчёт и опа! Видно, вызов какой функции сколько времени занял.

Так вы сможете понять, где находится "bottle neck" и исправить его.

Не забудьте отключить профайлер после того, как всё сделаете, нехрен ему висеть включённым!
xdebug.profiler_enable_trigger = 0
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо ABTOMAT за это полезное сообщение:
Harter (08.12.2012), moka (08.12.2012), Randomize (08.12.2012)