Xdebug - профессиональная отладка PHP

25 января 2018

Наша повестка дня

    Введение в topic.Загрузить и установить Xdebug на вашем локальном компьютере (Mac OS X 10.6.6+, MAMP 2.1.1).Integrating с помощью PhpStorm.nPractice debugging.


Что вам понадобится

A Mac работает под управлением Mac OS X 10.6.6 +.Если вы находитесь на 10.8.X, вам может потребоваться установить XQuartz, поскольку Apple удалил X11.nЕсли вы находитесь в Windows, весь процесс несколько проще, просто нажмите Google для получения более подробной информации.nApple Xcode 4.6 (бесплатно в Mac App Store).Command Line Tools.nHomebrew.nA приложение терминала по вашему выбору. PhpStorm 5+ (многие другие IDE тоже будут работать.)


Что такое Xdebug?

Ну, технически, Xdebug - это расширение для PHP, облегчающее вашу жизнь при отладке вашего кода. Прямо сейчас, вы можете использовать для отладки кода с помощью других простых решений. К ним относятся использование операторов echo в разных состояниях вашей программы, чтобы узнать, проходит ли ваше приложение условие или получает значение определенной переменной. Кроме того, вы можете часто использовать функции, такие как var_dump, print_r или другие, для проверки объектов и массивов.

Я часто сталкиваюсь с небольшими вспомогательными функциями, например, такими, как:

function dump($value) {
    echo ‘<pre>';
    var_dump($value);
    echo ‘</pre>';
}
Истина заключается в том, что я тоже делал это слишком долго. Фактически, я тоже делал это слишком долго. Так что же с этим не так? Технически, в этом нет ничего плохого. Он работает и делает то, что он должен делать.

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

Следующий вопрос: как вы отлаживаете производство? Опять же, представьте, что вы занимаетесь серфингом в одном из своих любимых веб-сервисов, и вдруг вы получаете большой массив дампов отладочной информации, представленной вам на экране. Теперь, конечно, он может исчезнуть после обновления следующего браузера, но это не очень хороший опыт для пользователя веб-сайта.

Теперь, наконец, вы когда-нибудь хотели, чтобы вы могли выполнить свой код, по очереди, смотреть выражения и даже входить в вызов функции, чтобы понять, почему он производит неправильное возвращаемое значение?

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


Настройка MAMP

Я не хочу слишком углубляться в процесс загрузки и установки MAMP на Mac. Вместо этого я просто расскажу вам, что я использую PHP 5.4.4 и стандартный Apache Port (80) на протяжении всего этого чтения.


Ваше первое решение

Быстрое замечание перед тем, как мы начнем с создания собственного Xdebug через Homebrew: если вы хотите использовать самый простой маршрут, MAMP уже поставляется с Xdebug 2.2.0. Чтобы включить его, откройте:

Приложения MAMP bin php php5.4.4 conf php.ini

с текстовым редактором по вашему выбору, идите в самое нижнее и раскомментируйте самую последнюю строку, удалив:.

Последние две строки файла должны выглядеть следующим образом:

[xdebug]
zend_extension="/Applications/MAMP/bin/php/php5.4.4/lib/php/extensions/ no-debug-non-zts-20100525/xdebug.so"

Теперь, если вы спрашиваете себя:

«Почему я хочу выбрать более жесткий путь, чем этот?»

И мой ответ на это: никогда не бывает ошибкой смотреть за пределы вашего обода и изучать что-то новое, Особенно, как разработчик в эти дни, бросая глаз на связанные с сервером вещи всегда пригодится в какой-то момент времени. Обещано.


Установка инструментов Xcode и командной строки

Вы можете бесплатно получить Apple Xcode из Mac App Store. После того как вы его загрузите, перейдите к настройкам приложения, нажмите вкладку «Загрузки» и установите «Инструменты командной строки» из списка.


Установить Homebrew

Homebrew - это аккуратный менеджер пакетов для Mac OS X, который доставит вам все, что Apple не учитывает. Чтобы установить Homebrew, просто вставьте следующую команду в свой терминал.

ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)"

На Mac, Homebrew будет самым удобным способом установки Xdebug. В Linux, однако, компиляция сама по себе - лучший способ пойти; что не так просто на Mac.

Будучи разработчиком PHP, вы должны с этого момента осознавать «репортер» Github «homebrew-php» Хозе Гонсалеса, который содержит много полезных «варежек» для вас. Если вы когда-либо задавались вопросом, как установить PHP 5.4 вручную, вы находитесь прямо здесь.

Теперь, если у вас возникнут проблемы при установке Homebrew, ознакомьтесь с Readme Хосе.

Чтобы завершить нашу экскурсию в Homebrew, мы хотим «надавить» на формула заваривания Хосе, выполнив следующие команды в вашем терминальном приложении:

brew tap homebrew/dupes

Это даст нам некоторые зависимости, которые нам нужны для формул Хосе.

brew tap josegonzalez/homebrew-php

Готово! Теперь мы должны быть готовы установить Xdebug на удобном пути, на Mac.


Установите Xdebug

Вернитесь в приложение терминала, выполните:

brew install php54-xdebug

Если вы находитесь на PHP 5.3, просто замените «4» на «3»;)

. Установка займет некоторое время. После этого вы увидите пивной значок и другие инструкции, которые вы можете игнорировать.

Итак, что же произошло? Homebrew загрузил все файлы, включая их зависимости, и построил их для вас. Как я уже сказал, компиляция на Mac может быть проблемой. В конце мы получили недавно скомпилированный файл xdebug.so, расположенный в локальном ядре Cellar php54-xdebug 2.2.1.

Внимание: обратите внимание, что Homebrew будет устанавливать PHP 5.4 в вашу систему во время процесса. Это не должно влиять ни на что, поскольку оно не включено в вашей системе.

Чтобы окончательно установить Xdebug, нам просто нужно выполнить еще несколько шагов.

Сменить каталог (cd) в папку расширений MAMP:

cd /Applications/MAMP/bin/php/php5.4.4/lib/php/extensions/no-debug-non-zts-20100525

Вы можете перепроверить путь, просмотрев последнюю строку приложений MAMP bin php php5.4.4 conf php.ini, так как это именно то, куда мы идем.

Резервное копирование существующего xdebug.so на всякий случай:

mv xdebug.so xdebug.so.bak

Затем скопируйте сборку Homebrew Xdebug:

cp /usr/local/Cellar/php54-xdebug/2.2.1/xdebug.so /Applications/MAMP/bin/php/php5.4.4/lib/php/extensions/no-debug-non-zts-20100525/

Если вы хотите принудительно выполнить команду копирования (cp) для перезаписывания существующих файлов, просто используйте cp -X source target.

Последнее, но не менее важное, нам нужно изменить файл php.ini для загрузки файла расширения Xdebug. Откройте приложения MAMP bin php php5.4.4 conf php.ini с текстовым редактором по вашему выбору, идите в самое нижнее и раскомментируйте последнюю строку, удалив точку с запятой спереди. Пока не закрывайте файл.

Теперь перезапустите MAMP, перейдите на http: localhost MAMP phpinfo.php. Если все пойдет хорошо, вы должны найти это в выходном файле:

Если это не сработало, убедитесь, что вы действительно скопировали файл xdebug.so и получили правильный путь в файле php.ini.


Начало отладки

Прежде чем мы сможем начать отладку, нам нужно включить Xdebug. Поэтому, надеюсь, вы не закрыли свой php.ini, так как нам нужно добавить эту строку до конца, после опции zend_extension:

xdebug.remote_enable = O

Сохраните и закройте файл php.ini и перезапустите MAMP. Перейдите в http: localhost MAMP phpinfo.php и найдите xdebug.remote на сайте. Ваши значения должны выглядеть точно так же, как у меня:

Если они этого не делают, следуйте той же процедуре, которую вы использовали для добавления remote_enable = On для других операторов в конце вашего файла php.ini.

Теперь откройте свою IDE. Вы можете использовать Xdebug с рядом популярных программных решений, таких как Eclipse, Netbeans, PhpStorm и Sublime Text. Как я уже говорил, я собираюсь использовать PhpStorm EAP 6 для этой демонстрации.

Внутри PhpStorm откройте настройки приложения и найдите свой путь к «PHP Debug DBGp Proxy» с левой стороны, как показано на скриншоте ниже:

Теперь выберите свой личный ключ IDE. Это может быть любая алфавитно-цифровая строка, которую вы хотите. Я предпочитаю просто называть его PHPSTORM, но XDEBUG_IDE или myname тоже будет отлично. Важно установить значение «Порт» равным 9000, поскольку наша стандартная конфигурация Xdebug использует этот порт для подключения к среде IDE.

Затем нажмите эту красную маленькую кнопку телефона с крошечной ошибкой рядом с ней на верхней панели инструментов. Он должен стать зеленым. Это заставляет PhpStorm прослушивать любые входящие соединения Xdebug.

Теперь нам нужно создать что-то для отладки. Создайте новый файл PHP, назовите его, что бы вы хотели, и вставьте следующий код:

<?php
// Declare data file name
$dataFile = 'data.json';
// Load our data
$data = loadData($dataFile);
// Could we load the data?
if (!$data) {
    die('Could not load data');
}
if (!isset($data['hitCount'])) {
    $data['hitCount'] = 1;
}
else {
    $data['hitCount'] += 1;
}
$result = saveData($data, $dataFile);
echo ($result) ? 'Success' : 'Error';
function loadData($file)
{
    // Does the file exist?
    if (!file_exists($file)) {
        // Well, just create it now
        // Save an empty array encoded to JSON in it
        file_put_contents($file, json_encode(array()));
    }
    // Get JSON data
    $jsonData = file_get_contents($file);
    $phpData  = json_decode($jsonData);
    return ($phpData) ? $phpData : false;
}
function saveData($array, $file)
{
    $jsonData = json_encode($array);
    $bytes = file_put_contents($file, $jsonData);
    return ($bytes != 0) ? true : false;
}

Теперь этот код по умолчанию ложный, но в следующем разделе мы его исправим.

Убедитесь, что все сохранено, и откройте свой браузер для скрипта, который мы только что создали. Я буду использовать Google Chrome для этой демонстрации, но любой браузер сделает это.

Теперь давайте рассмотрим, как инициализируется процесс отладки. Наш текущий статус: Xdebug включен как расширение Zend, слушая порт 9000, чтобы файл cookie появлялся во время запроса. Этот файл cookie будет иметь ключ IDE, который должен быть таким же, как тот, который мы установили внутри нашей среды разработки. Поскольку Xdebug видит файл cookie с запросом, он попытается подключиться к прокси-серверу, нашей IDE.

Итак, как мы можем получить этот файл cookie? PHP setcookie? Нет. Хотя есть несколько способов, даже некоторые, чтобы заставить это работать без cookie, мы будем использовать небольшое расширение браузера в качестве помощника.

Установите «помощник Xdebug» в свой браузер Google Chrome или найдите любое расширение, которое сделает это для используемого вами браузера.

После того, как вы установили расширение, щелкните правой кнопкой мыши небольшую ошибку, появляющуюся в адресной строке и перейдите к настройкам. Настройте значение для ключа IDE в соответствии с ключом, который вы выбрали в своей среде IDE, например:

. После настройки нажмите на ошибку и выберите «Отладка» из списка. зеленый цвет:

Теперь вернитесь к PhpStorm или вашей IDE по выбору и установите «точку останова». Точки останова напоминают маркеры в строке, которые говорят отладчику прекратить выполнение скрипта в этой точке останова.

В PhpStorm вы можете просто добавить точки останова, щелкнув пробел рядом с номерами строк в левой части:

Просто попробуйте щелкнуть, где на скриншоте появится красная точка. Затем у вас будет точка останова, на которой ваш сценарий должен приостановиться.

Примечание: вы можете иметь несколько br eakpoints в столько файлов, сколько захотите.

Теперь мы все настроены. Вернитесь в свой браузер, убедитесь, что ошибка зеленая и просто перезагрузите страницу, чтобы отправить файл cookie со следующим запросом.

Если все идет по плану, это окно должно появиться внутри PhpStorm, чтобы сообщить вам о входящем отладочном соединении:

Не появилось ли окно для вас? Попробуем устранить неполадки и повторим то, что должно быть установлено, чтобы это удалось:

    Вы должны найти информацию Xdebug внутри вывода phpinfo (). Если нет, получите файл xdebug.so в нужном месте и настройте параметры php.ini file.nSet PhpStorm DBGp на ваш IDE-ключ, например. «PHPSTORM» и порт «9000».nMake PhpStorm прослушивает входящие отладочные подключения, используя красный значок телефона, который затем станет зеленым. NУстановите точку останова в вашем коде или выберите «Запустить перерыв в первой строке в скриптах PHP», чтобы быть независимым от любые точки останова. Обратите внимание, что это не подходит для практического использования. Получите расширение браузера, чтобы установить файл cookie Xdebug. Убедитесь, что расширение браузера имеет тот же самый IDE-ключ, который вы выбрали внутри своей IDE.nНагрузите страницу, и PhpStorm получит соединение.

Если вы увидите диалоговое окно, увиденное на предыдущем изображении, примите его. Это приведет вас в режим отладки, например:

Вы можете видеть, что отладчик остановил выполнение сценария в точке останова, выделив строку синим цветом. PHP теперь ждет и контролируется Xdebug, с которого сейчас управляют ваши собственные руки.

Нашей основной рабочей средой будет нижний раздел IDE, который уже показывает некоторую информацию о запущенном скрипте (суперглобалы).

И посмотрите на это? Есть файл cookie, который мы просто установили для начала сеанса отладки. Теперь вы можете щелкнуть через суперглобалы и проверить их значения в этот самый момент. PHP ждет, нет ограничения по времени, по крайней мере, не по умолчанию 30 секунд.

С левой стороны вы увидите несколько кнопок. Пока что нас интересуют только «Play» и «Stop». Зеленая кнопка воспроизведения возобновит выполнение сценария. Если в коде есть еще одна точка останова, сценарий будет продолжаться до тех пор, пока он не достигнет точки останова и не остановится снова.

Красная кнопка остановки отменяет сценарий. Точно так же, как выход PHP или умереть.

Теперь действительно интересные из них попадают в верхнюю часть окна отладки:

Давайте быстро проверим их:

    Step Over: Это означает, что один шаг вперед. Step Into: Если синяя линия подчеркивает, например, вызов функции, эта кнопка позволяет вам перейти к пониманию функции. Step Out: если вы вошли в функцию и хотите выйти до того, как достигнут конец, просто откройте out.Run в курсор: Let's скажем, что, например, ваш файл имеет длину 100 строк, а точка останова была установлена ​​на второй строке, чтобы что-то проверить. Теперь вы хотите быстро перейти к точке, где вы просто нажали на свой курсор, - эта кнопка для вас. Вы также можете нажать «Step over»раз;)

Теперь не беспокойтесь, поскольку вы используете Xdebug, вы быстро адаптируетесь к ярлыкам на клавиатуре.


На самом деле отладка некоторых примеров кода

Я уже говорил вам, что код, который вы скопировали, является ложным, поэтому вам нужно его отладить. Начните переходить через код, выставлять оператор.

Когда вы дойдете до вызова функции loadData, не входите в нее, просто переходите и останавливайтесь на инструкции if.

Вы можете увидеть две новые переменные на панели «Переменные» в нижней части экрана. Теперь, почему переменная $ data возвращает false? Кажется, сценарий должен был выполнить свою работу. Давайте взглянем. Вернитесь к строке 7, чтобы войти в вызов функции -> bam! Мы получаем сообщение, сообщающее нам, что мы не можем «отступить». Чтобы снова вернуть ваш отладчик в строку 7, вам необходимо остановить этот сеанс и перезагрузить страницу в браузере. Сделайте это и войдите в вызов функции на этот раз.

Остановить оператор return внутри функции loadData и посмотреть, что произошло:

Массив $ phpData пуст. Оператор return использует трёхмерный оператор для определения возвращаемого значения. И он вернет false для пустого массива.

Исправьте строку, чтобы сказать:

return $phpData;

Поскольку json_decode будет либо возвращать данные, либо null при ошибке. Теперь остановите сеанс отладки, перезагрузите браузер и перейдите на вызов функции на этот раз.

Теперь кажется, что у нас все еще есть проблема, когда мы входим в это условие. Исправьте условие, чтобы использовать is_null (), чтобы определить, что происходит:

if (is_null($data)) {
    die('Could not load data');
}

Теперь вам решать попробовать немного. Я бы предложил вернуть скрипт в оригинальную фальшивую версию, отладить ее с помощью эха, а затем сравнить, как это выглядит по сравнению с использованием Xdebug.


Заключение

На протяжении всей этой статьи вы должны были получить много новых знаний. Не стесняйтесь читать его снова и помогать другу настроить Xdebug - ничего лучше этого!

Вы можете попытаться заменить обычное поведение отладки, используя вместо этого Xdebug. Особенно с более крупными объектно-ориентированными проектами, поскольку они становятся намного легче отлаживать и даже догонять поток, если вы не получите что-то сразу.

Обратите внимание, что это только верхушка айсберга. Xdebug предлагает гораздо больше возможностей, которые необходимо изучить.

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