> Какие инструменты для отладки PHP используются (PHP)

Уровень: senior · Роль: backend · Язык: PHP · Категория: Технические вопросы

Компании: vanta

Стек: PHP

> Пример ответа

Короткий ответ

Основные инструменты: Xdebug для step-debugging и profiling, PHPUnit/Pest для тестов, Monolog для логирования, Blackfire и Tideways для профилирования в production, Laravel Telescope и Symfony Profiler для фреймворков. Также полезны phpdbg, opcache inspection, и стандартные error_log с настройками display_errors. Для CLI - PsySH и Tinker. Выбор зависит от задачи: отладка логики, производительности или интеграций.

Подробное объяснение

Инструменты делятся на категории:

  • Step-debugging: Xdebug - стандарт де-факто, работает через DBGp протокол с IDE (PhpStorm, VS Code). Позволяет ставить breakpoints, смотреть стек, переменные, выполнять код по шагам. Альтернатива - phpdbg (встроенный SAPI, легче, но менее удобен).
  • Profiling: Xdebug profiler (cachegrind файлы, анализируются через QCacheGrind/Webgrind), Blackfire (коммерческий, низкий overhead, хорош для production), Tideways (агрегация профилей, интеграция с APM). Для быстрых замеров - microtime(true) и memory_get_peak_usage().
  • Логирование: Monolog - стандарт PSR-3, каналы, handlers (file, syslog, slack). В фреймворках - встроенные логгеры (Laravel Log, Symfony Logger).
  • Фреймворк-специфичные: Laravel Telescope (debug bar, запросы, кеш, jobs), Symfony Profiler (панель в dev-режиме, timeline, исключения), Debugbar для Laravel.
  • Production-диагностика: Error tracking (Sentry, Bugsnag), APM (New Relic, Datadog), логирование через ELK/Loki. Для проверки opcache - opcache_get_status(), для медленных запросов - slow query log MySQL.
  • CLI-отладка: PsySH (REPL), Laravel Tinker, php -a. Для интерактивного дебага в консоли - xdebug_break().
  • Тестирование: PHPUnit, Pest - не только для тестов, но и для воспроизведения багов.

Важно понимать trade-off: Xdebug в production не используют (overhead до 200%), для этого есть Blackfire/Tideways с sampling.

На практике

  • Локальная разработка: включить Xdebug в режиме debug, настроить IDE на port 9003 (или 9000 для старых версий). Использовать breakpoints вместо var_dump.
  • Быстрая проверка: error_reporting(E_ALL), ini_set('display_errors', '1') в dev, логировать в файл в prod.
  • Медленный endpoint: сначала Blackfire профиль, потом Xdebug локально для конкретного участка.
  • Интеграция с внешним API: логировать request/response через Monolog, использовать Telescope для Laravel.
  • Очереди и cron: логировать в отдельные каналы, использовать контекст (job id, timestamp).
  • Память: memory_get_peak_usage(true) в конце скрипта, для поиска утечек - Blackfire или Xdebug trace.

Пример кода

PHP
// Настройка Monolog для отладки
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$log = new Logger('app');
$log->pushHandler(new StreamHandler(__DIR__ . '/logs/debug.log', Logger::DEBUG));
// Логирование с контекстом
$log->debug('User login', ['user_id' => $userId, 'ip' => $ip]);
// Xdebug breakpoint в коде (для CLI)
if (function_exists('xdebug_break')) {
xdebug_break();
}
// Быстрый профиль без Xdebug
$start = microtime(true);
// ... код ...
error_log(sprintf('Time: %.4f sec, Memory: %d KB',
microtime(true) - $start,
memory_get_peak_usage(true) / 1024
));

Как отвечать на собеседовании

Структурируй ответ по сценариям: dev, staging, production. Начни с Xdebug как основного, упомяни альтернативы. Покажи понимание ограничений: Xdebug не для prod, профилирование нужно для узких мест. Приведи конкретный пример из практики: как нашёл утечку памяти или медленный SQL. Если спросят про фреймворк - упомяни Telescope/Symfony Profiler. Не перечисляй инструменты списком, а объясняй, когда какой использовать. Хорошо добавить про мониторинг ошибок (Sentry) и логирование как часть отладки.

Что проверяет интервьюер

  • Понимание разницы между debugging и profiling.
  • Знание, когда использовать Xdebug, а когда - production-инструменты.
  • Умение работать с логами и контекстом.
  • Практический опыт: как дебажить сложный баг (не просто "поставил breakpoint").
  • Понимание overhead и trade-off инструментов.
  • Знание фреймворк-специфичных решений.
  • Умение диагностировать проблемы производительности и памяти.

Типичные ошибки

  • Использование var_dump/die в production коде.
  • Включённый Xdebug в production (или display_errors=1).
  • Отсутствие структуры в логах: логировать без контекста, не разделять по уровням.
  • Игнорирование profiling: "и так работает, зачем профилировать".
  • Путаница между Xdebug и Blackfire - это разные задачи.
  • Незнание, что phpdbg существует и легче Xdebug для CI.
  • Забывают про opcache: код меняется, но не применяется - нужно сбрасывать opcache или использовать opcache.validate_timestamps.
  • Логирование чувствительных данных (пароли, токены) в debug-логи.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью