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

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

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

Начать курс

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

Каждый PHP-разработчик хотя бы раз в жизни сталкивался с белым экраном смерти, необъяснимым 500 Internal Server Error или переменной, которая «вот только что работала». В такие моменты хочется выбросить ноутбук в окно. Но вместо этого — давайте превратим отладку PHP кода в рутину, которая не вызывает дрожи в коленях.

В этой статье мы разберём техники и инструменты, которые помогут вам находить баги быстрее, чем закипает чайник. От классического var_dump() до продвинутой настройки Xdebug — всё с живыми примерами и реальными кейсами. Поехали!

1. Базовая отладка: от var_dump() до error_reporting

1.1. var_dump() и print_r() — дедовские, но рабочие методы

Самый простой способ отладки PHP кода — вывести содержимое переменной на экран. Да, это не элегантно, но когда нужно быстро понять, что лежит в массиве, var_dump() делает свою работу на 100%.

<?php
$users = [
    ['name' => 'Иван', 'age' => 25],
    ['name' => 'Мария', 'age' => 30]
];

// var_dump покажет типы данных и структуру
var_dump($users);

// print_r — более компактный вариант
echo '<pre>';
print_r($users);
echo '</pre>';
?>

Совет: Используйте <pre> вокруг вывода, чтобы сохранить форматирование. И никогда не забывайте удалять такие отладочные строки перед выкладкой на продакшн — иначе пользователи увидят ваши «скелеты в шкафу».

1.2. Включаем показ всех ошибок

Стандартная настройка PHP часто скрывает ошибки «под одеялом». Чтобы их увидеть, добавьте в начало скрипта:

<?php
// Показать все ошибки, включая нотисы и варнинги
error_reporting(E_ALL);
ini_set('display_errors', 1);
?>

Это особенно полезно при отладке PHP кода на локальном сервере. Но на продакшне обязательно выключайте display_errors — это угроза безопасности!

1.3. debug_backtrace() — кто вызвал эту функцию?

Бывает, что функция вызывается не из того места. Трассировка стека вызовов помогает найти источник:

<?php
function logError($message) {
    $trace = debug_backtrace();
    echo "Ошибка в файле: {$trace[0]['file']} на строке {$trace[0]['line']}<br>";
    echo "Сообщение: $message";
}

// Теперь любой вызов logError покажет, откуда он пришёл
logError('Что-то пошло не так');
?>

2. Xdebug — швейцарский нож для отладки PHP

2.1. Установка и настройка Xdebug

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

Установка через pecl (для Linux/Mac):

pecl install xdebug

Для Windows проще скачать .dll с официального сайта и добавить в php.ini:

zend_extension = /путь/к/xdebug.so
xdebug.mode = debug
xdebug.start_with_request = yes

2.2. Точки останова в IDE

Если вы используете PhpStorm или VS Code, настройте интеграцию с Xdebug. Ставите точку останова (красный кружок слева от строки кода), запускаете отладку — и код останавливается на этой строке. Вы видите все переменные, можете выполнять шаги и даже менять значения «на лету».

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

2.3. Профайлинг с Xdebug

Медленный код? Включите профайлер:

xdebug.mode = profile
xdebug.output_dir = /tmp/profiles

После запуска скрипта получите файл, который можно открыть в KCacheGrind или QCacheGrind. Вы увидите, какие функции жрут больше всего времени. Часто оказывается, что виноват не сам PHP, а бесконечный цикл или неоптимальный SQL-запрос.

3. Логирование ошибок — ваш личный детектив

3.1. Настройка error_log

Не всегда можно выводить ошибки на экран (особенно на продакшне). Включаем логирование:

// В php.ini
error_log = /var/log/php_errors.log
log_errors = On

Или прямо в коде:

<?php
error_log('Пользователь попытался войти с неверным паролем', 3, '/var/log/myapp.log');
?>

Третий параметр — путь к файлу. Удобно для кастомного логирования.

3.2. Создаём свой обработчик ошибок

Стандартные ошибки — это скучно. Давайте сделаем свой обработчик, который будет отправлять ошибки в Telegram или Slack:

<?php
function customErrorHandler($severity, $message, $file, $line) {
    $log = "[Ошибка] $message в файле $file на строке $line";

    // Отправляем в лог
    error_log($log);

    // Отправляем в Telegram (упрощённо)
    $telegramToken = 'YOUR_BOT_TOKEN';
    $chatId = 'YOUR_CHAT_ID';
    $url = "https://api.telegram.org/bot$telegramToken/sendMessage?chat_id=$chatId&text=" . urlencode($log);
    file_get_contents($url);

    // Показываем пользователю красивое сообщение
    echo 'Произошла внутренняя ошибка. Мы уже знаем о ней и скоро всё починим.';
}

set_error_handler('customErrorHandler');
?>

4. Продвинутые техники отладки PHP

4.1. Debug-бар: PHP Debug Bar или Symfony VarDumper

Когда проект разрастается, простой var_dump() уже не спасает. Используйте PHP Debug Bar — тулбар, который покажет время выполнения, SQL-запросы, переменные сессии и многое другое.

Установка через Composer:

composer require maximebf/php-debugbar

Подключение в коде:

<?php
require 'vendor/autoload.php';

$debugbar = new DebugBar\StandardDebugBar();
$debugbarRenderer = $debugbar->getJavascriptRenderer();

// Добавляем сообщение
$                

Блоги

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