Введение: почему отладка — это суперсила разработчика
Каждый 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();
// Добавляем сообщение
$