Как профилировать PHP-приложение (Xdebug, Blackfire)?php-56

Зачем нужно профилирование?

Профилирование помогает выявить:

  • Узкие места производительности
  • Проблемы с памятью
  • Неоптимальные SQL-запросы
  • Долгие внешние вызовы

1. Xdebug

Установка и настройка

# Установка (Linux)
sudo apt install php-xdebug

# Конфигурация php.ini
zend_extension=xdebug.so
xdebug.mode=profile
xdebug.output_dir=/tmp/xdebug
xdebug.trigger_value=START_PROFILING

Использование

  1. Автоматическое профилирование всех запросов:
xdebug.mode=profile
xdebug.start_with_request=yes
  1. Триггерное профилирование (только для конкретных запросов):
// В коде:
if (isset($_GET['XDEBUG_PROFILE'])) {
    xdebug_start_profiling();
}
  1. Анализ результатов (используйте KCacheGrind/QCacheGrind):
# Установка анализатора
sudo apt install kcachegrind

# Запуск
kcachegrind /tmp/xdebug/cachegrind.out.*

Преимущества Xdebug:

  • Встроен в PHP
  • Детальная информация о вызовах функций
  • Интеграция с IDE

Недостатки:

  • Сильно замедляет выполнение (в 10-50 раз)
  • Сложный анализ результатов

2. Blackfire

Установка

# Установка агента и расширения
curl -sSL https://packages.blackfire.io/gpg.key | sudo apt-key add -
echo "deb http://packages.blackfire.io/debian any main" | sudo tee /etc/apt/sources.list.d/blackfire.list
sudo apt update && sudo apt install blackfire-php blackfire-agent

Настройка

  1. Регистрация на blackfire.io
  2. Получение credentials:
blackfire agent:config --client-id=xxx --client-token=xxx
blackfire agent:start

Использование

  1. Профилирование через CLI:
blackfire run php script.php
  1. Профилирование веб-запросов:
  • Установите расширение для браузера
  • Нажмите кнопку "Profile" в инструментах разработчика
  1. Программное профилирование:
<?php
$probe = new \Blackfire\Client();
$probe->enable();

// Код для профилирования

$probe->disable();

Преимущества Blackfire:

  • Минимальное влияние на производительность
  • Красивый веб-интерфейс
  • Рекомендации по оптимизации
  • Сравнение разных прогонов

Недостатки:

  • Коммерческий продукт (бесплатен для разработки)
  • Требует облачной интеграции

3. Альтернативные инструменты

Tideways

composer require tideways/profiler

PHP Built-in Web Server

php -S localhost:8000 -t ./public
ab -n 100 -c 10 http://localhost:8000/

Лучшие практики профилирования

  1. Профилируйте на production-подобном окружении
  2. Сравнивайте несколько прогонов
  3. Фокусируйтесь на самых дорогих операциях
  4. Проверяйте как CPU, так и память
  5. Оптимизируйте только то, что действительно важно

Пример оптимизации на основе профилирования

До оптимизации:

Function Calls    Time (ms)
getUserData()      1200
renderView()        800

После оптимизации:

Function Calls    Time (ms)
getUserData()       400  (кэширование)
renderView()        300  (оптимизация шаблонов)

Резюмируем:

Xdebug лучше подходит для глубокого анализа конкретных участков кода, тогда как Blackfire — это профессиональное решение для постоянного мониторинга производительности. Для большинства проектов оптимально использовать Blackfire в production и Xdebug для локальной отладки.