Отладка PHP кода: техники и инструменты для профи

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: Почему отладка — это суперсила разработчика

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

В этой статье мы не просто перечислим функции. Мы разберем реальные сценарии: от простого var_dump() до настройки Xdebug в IDE. Вы узнаете, как превратить процесс поиска ошибок в структурированную рутину, а не в гадание на кофейной гуще. Поехали!

1. Классика жанра: var_dump и print_r

Самый простой способ отладки PHP — это вставить var_dump($variable) в подозрительное место. Но есть нюанс: не все делают это правильно.

Правильный var_dump

Многие пишут так:

var_dump($user);

И получают кашу на экране. Лучше форматировать вывод:

echo '<pre>';
var_dump($user);
echo '</pre>';
die(); // остановить выполнение, чтобы не мешал остальной вывод

А для массивов и объектов удобнее print_r() с флагом true, чтобы сохранить результат в строку:

$data = print_r($users, true);
file_put_contents('debug.log', $data, FILE_APPEND);

Совет: Никогда не оставляйте var_dump в продакшене. Используйте условную отладку:

if (defined('DEBUG_MODE') && DEBUG_MODE) {
    var_dump($variable);
}

2. Логгирование: ваш лучший друг в продакшене

Когда сайт уже на сервере, вы не можете просто вывести ошибку на экран. Тут на помощь приходит логгирование PHP. Встроенная функция error_log() — это база.

Как настроить error_log

В файле php.ini укажите:

error_reporting = E_ALL
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log

Теперь все ошибки, включая предупреждения, будут писаться в файл. А в коде можно делать так:

if ($result === false) {
    error_log("Ошибка запроса к БД: " . $db->error, 3, '/var/log/myapp.log');
    // 3 — означает запись в файл, а не в syslog
}

Современный подход: Monolog

Для серьезных проектов используйте библиотеку Monolog. Она умеет писать в файлы, в Slack, в базу данных и даже в Telegram. Пример подключения:

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$log = new Logger('my_app');
$log->pushHandler(new StreamHandler(__DIR__ . '/app.log', Logger::WARNING));
$log->warning('Пользователь попытался зайти без прав', ['user_id' => 123]);

3. Xdebug: реактивный движок отладки

Если вы до сих пор не установили Xdebug, вы теряете время. Это не просто инструмент — это реактивный ранец для разработчика. Он позволяет ставить точки остановки (breakpoints), смотреть значения переменных в реальном времени и даже профилировать код.

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

Установите через пакетный менеджер:

pecl install xdebug
# или для Ubuntu:
sudo apt install php-xdebug

Добавьте в php.ini:

zend_extension=xdebug.so
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=127.0.0.1
xdebug.client_port=9003

Теперь настройте вашу IDE. В PhpStorm это делается в два клика: настройте интерпретатор PHP и нажмите "Start Listening for PHP Debug Connections".

Как это работает в жизни

Ставите точку остановки (красный кружок) в строке с подозрительным кодом. Запускаете скрипт в браузере с параметром ?XDEBUG_SESSION_START=1. IDE "замерзает" выполнение, и вы видите все переменные, стек вызовов и можете выполнять код по шагам (Step Over, Step Into).

Пример: Вы ищете, почему в корзине неправильная сумма. Ставите breakpoint на расчете скидки, смотрите значение $discount — и сразу видите, что оно пришло как строка, а не число. Баг найден за 10 секунд.

4. Инструменты для продвинутых: профилирование и трейсинг

Иногда код работает, но слишком медленно. Тут нужны инструменты отладки PHP для профилирования.

Xdebug Profiler

Включите в php.ini:

xdebug.mode=profile
xdebug.output_dir=/tmp

После выполнения скрипта вы получите файл .cachegrind. Откройте его в QCacheGrind или Webgrind — вы увидите, какие функции жрут больше всего времени и памяти.

Tideways и Blackfire

Это облачные сервисы, которые показывают не только время выполнения, но и SQL-запросы, HTTP-вызовы. Полезно для сложных проектов на Laravel или Symfony.

5. Обработка исключений: не дайте ошибке сломать всё

Грамотная отладка кода PHP невозможна без правильной обработки исключений. Используйте try-catch блоки:

try {
    $user = $db->query("SELECT * FROM users WHERE id = ?", [$id]);
    if (!$user) {
        throw new Exception("Пользователь не найден");
    }
} catch (Exception $e) {
    error_log($e->getMessage());
    // Показываем пользователю красивое сообщение, а не stack trace
    echo "Извините, произошла ошибка. Мы уже знаем о ней.";
}

Для глобального перехвата используйте set_exception_handler():

set_exception_handler(function($exception) {
    $log = new Logger('global');
    $log->critical($exception->getMessage(), ['file' => $exception->getFile()]);
    http_response_code(500);
    include 'error500.html';
});

6. Практический чек-лист: как отлаживать быстро

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

  • Шаг 1. Воспроизведите ошибку.

Блоги

Рекомендаций по книгам