Avatar ·

Как правильно отлаживать PHP-скрипты: от var_dump до Xdebug

Всем привет! Я новичок в PHP и уже вторую неделю мучаюсь с отладкой кода. Проблема в том, что я не понимаю, как эффективно находить ошибки. Сейчас я делаю так: вставляю везде echo и var_dump, чтобы посмотреть, что происходит в переменных. Но это очень неудобно — код засоряется, а если ошибка в цикле или вложенном условии, то я трачу часы, переставляя эти echo. Вот пример моего кода, который не работает как надо: ```php >>

Профессиональная отладка PHP: от базовых методов до Xdebug

Вы на верном пути, но var_dump и echo — это "каменный век" отладки. Для эффективной работы нужно освоить несколько уровней инструментов. Давайте разберём вашу конкретную проблему и покажу, как её решить по-взрослому.

1. Анализ вашей проблемы через error_log

Прежде чем ставить Xdebug, можно улучшить базовый подход. Вместо echo используйте error_log() — данные уйдут в лог-файл, не засоряя вывод:

error_log(print_r($data, true)); // Пишет в лог
error_log('Статус: ' . $data['status']); // Конкретная переменная

Но в вашем случае проблема вероятнее в transformData(). Проверьте её возврат:

function processUsers($users) {
    $result = [];
    foreach ($users as $user) {
        $data = getUserData($user['id']);
        if ($data['status'] == 'active') {
            $processed = transformData($data);
            error_log('Processed result: ' . json_encode($processed)); // Логируем
            $result[] = $processed;
        }
    }
    error_log('Final result count: ' . count($result)); // Логируем итог
    return $result;
}

2. Настройка Xdebug для пошаговой отладки

Xdebug позволяет ставить точки останова (breakpoints) и смотреть состояние всех переменных в реальном времени. Вот как настроить:

Установка (OpenServer):

  • В меню OpenServer выберите «Настройки» → «Модули» → поставьте галочку на Xdebug (обычно идёт в комплекте с PHP 8.2).
  • Перезапустите сервер.

Настройка VS Code:

  • Установите расширение "PHP Debug" от Felix Becker.
  • Создайте файл .vscode/launch.json в корне проекта:
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for Xdebug",
            "type": "php",
            "request": "launch",
            "port": 9003,
            "pathMappings": {
                "/var/www/html": "${workspaceFolder}"
            }
        }
    ]
}

Процесс отладки:

  1. Поставьте точку останова (красный кружок) слева от строки $processed = transformData($data);.
  2. Нажмите F5 (Run → Start Debugging).
  3. Откройте ваш скрипт в браузере. Выполнение остановится на точке останова.
  4. В VS Code слева появится панель с переменными: $data, $user, $result. Наведите мышку — увидите все значения.
  5. Нажмите F10 (Step Over) — выполнится строка, и вы увидите, что вернула transformData(). Если $processed оказался null или false — проблема в этой функции.
  6. Нажмите F11 (Step Into) — войдёте внутрь transformData() и увидите её логику пошагово.

3. Расшифровка вашей ошибки

Судя по коду, transformData() может возвращать null при каких-то условиях. Вместо гаданий, поставьте точку останова внутри этой функции и посмотрите, какие данные приходят и что возвращается. С Xdebug это занимает 10 секунд вместо 30 минут с var_dump.

4. Дополнительные приёмы

  • Watch expressions: В VS Code в панели отладки добавьте выражение count($result) — будет автоматически обновляться.
  • Conditional breakpoints: Кликните правой кнопкой на точку останова → "Edit breakpoint" → введите условие: $user['id'] == 42. Остановится только для этого пользователя.
  • Stack trace: При ошибке Xdebug покажет полный стек вызовов — сразу видно, откуда пришёл вызов.

После настройки Xdebug вы забудете про var_dump. Это как перейти с велосипеда на автомобиль — та же цель, но в 100 раз быстрее и комфортнее.

<<>>

Альтернативный подход: отладка через логирование и профайлинг

Если Xdebug кажется слишком сложным для быстрой настройки, используйте структурированное логирование. Это особенно полезно на production-серверах, где Xdebug ставить нельзя.

Создайте простую функцию-помощник:

function debug_log($data, $label = '') {
    $log = '[' . date('Y-m-d H:i:s') . '] ';
    $log .= $label ? $label . ': ' : '';
    $log .= json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
    file_put_contents(__DIR__ . '/debug.log', $log . PHP_EOL, FILE_APPEND);
}

// Использование:
debug_log($data, 'Данные пользователя');
debug_log($processed, 'Результат transformData');

Этот метод не тормозит выполнение (в отличие от echo) и сохраняет всю историю. Вы можете открыть debug.log и проанализировать все шаги после выполнения скрипта.

Дополнительный совет: Для вашей конкретной проблемы с пустым результатом добавьте логирование в transformData():

function transformData($data) {
    debug_log($data, 'Входные данные в transformData');
    // ... ваша логика ...
    debug_log($result, 'Выходные данные из transformData');
    return $result;
}

Так вы сразу увидите, на каком этапе данные теряются. Этот метод хорош тем, что не требует установки расширений и работает на любом хостинге.