Введение: Почему отладка — это суперсила разработчика
Вы когда-нибудь сидели ночью, уставившись в монитор, и не могли понять, почему ваш 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. Воспроизведите ошибку.