Статьи

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

  1. Введение в тему.
  2. Загрузка и установка Xdebug на вашем локальном компьютере (Mac OS X 10.6.6+, MAMP 2.1.1).
  3. Интеграция с PhpStorm.
  4. Практика отладки.


  • Mac под управлением Mac OS X 10.6.6+.
    • Если вы используете 10.8.X, вам может потребоваться установить XQuartz, поскольку Apple удалила X11.
    • Если вы работаете в Windows, весь процесс несколько проще, просто нажмите Google для более подробной информации.
  • Apple Xcode 4.6 (бесплатно в Mac App Store).
    • Инструменты командной строки.
  • Homebrew.
  • Терминальное приложение на ваш выбор.
  • PhpStorm 5+ (многие другие IDE также будут работать).

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

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

1
2
3
4
5
function dump($value) {
    echo ‘<pre>’;
    var_dump($value);
    echo ‘</pre>’;
}

По правде говоря, я тоже делал это очень долго.

По правде говоря, я тоже делал это очень долго. Так что с этим не так? Технически, в этом нет ничего плохого. Это работает и делает то, что должно делать.

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

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

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

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


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


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

/Applications/MAMP/bin/php/php5.4.4/conf/php.ini

с выбранным вами текстовым редактором перейдите к самому низу и раскомментируйте самую последнюю строку, удалив ; ,

Последние две строки файла должны выглядеть так:

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

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

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

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


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


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

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

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

Совет: пользователям Windows просто нужно загрузить файл *.dll с Xdebug.org, поместить его в папку XAMPP и добавить путь к своему файлу php.ini .

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

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

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

1
brew tap homebrew/dupes

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

1
brew tap josegonzalez/homebrew-php

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


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

1
brew install php54-xdebug

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

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

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

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

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

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

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

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

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

1
mv xdebug.so xdebug.so.bak

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

1
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/

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

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

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

Xdebug-в-phpinfo

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


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

1
xdebug.remote_enable = On

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

Xdebug-дистанционного-в-phpinfo

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

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

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

PhpStorm-отладочные-настройки

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

Совет: если вам нужно это настроить, добавьте xdebug.remote_port = portnumber в ваш файл php.ini .

Внимание: другие компоненты могут изменять это значение внутри PhpStorm, поэтому следите за ним, если что-то не получится.

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

PhpStorm-ошибка-телефон

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?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) ?
 
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) ?
}
 
function saveData($array, $file)
{
    $jsonData = json_encode($array);
    $bytes = file_put_contents($file, $jsonData);
 
    return ($bytes != 0) ?
}

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

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

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

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

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

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

Xdebug-браузер расширение

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

Xdebug-браузер расширение активных

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

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

PhpStorm-точка останова

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

Примечание. У вас может быть несколько точек останова в любом количестве файлов.

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

Совет: если вы установите cookie, он будет доступен для следующего запроса.

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

PhpStorm-входящие-отладка-соединение

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

  1. Вы должны найти информацию Xdebug внутри phpinfo() . Если нет, найдите файл xdebug.so в нужном месте и настройте файл php.ini .
  2. Установите в настройках PhpStorm DBGp свой ключ IDE, например, «PHPSTORM» и порт «9000».
  3. Заставьте PhpStorm прослушивать входящие отладочные соединения, используя красный значок телефона, который затем станет зеленым.
  4. Установите точку останова в своем коде или выберите «Run \ Break at first line в скриптах PHP», чтобы она не зависела от каких-либо точек останова. Обратите внимание, что это не подходит для практического использования.
  5. Получите расширение для браузера, чтобы установить файл cookie Xdebug.
  6. Убедитесь, что расширение браузера имеет тот же ключ IDE, который вы выбрали внутри вашей IDE.
  7. Перезагрузите страницу и PhpStorm должен получить соединение.

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

PhpStorm-в-отладочный режим

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

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

PhpStorm-отладчик-вары

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

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

Красная кнопка остановки отменяет скрипт. Так же, как exit PHP или die .

PhpStorm-отладчик-игра-стоп

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

PhpStorm-отладчик-контроль

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

  1. Шаг за шагом : это означает, что шаг вперед на одну строку.
  2. Step Into : если синяя линия подсвечивает, например, вызов функции, эта кнопка позволяет вам перейти к пониманию функции.
  3. Выход : Если вы вошли в функцию и хотите выйти до того, как достигнут конец, просто выйдите.
  4. Запуск до курсора . Допустим, например, что ваш файл имеет длину 100 строк, а точка останова была установлена ​​на второй строке, чтобы что-то проверить. Теперь вы хотите быстро перейти к точке, в которой вы только что щелкнули курсором — эта кнопка для вас. Вы также можете нажать «Перешагнуть» n раз;)

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


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

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

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

PhpStorm-отладчик вы-косяк-гоу-обратно

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

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

PhpStorm-отладчик-в-функции

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

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

1
return $phpData;

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

PhpStorm-отладчик-прежнему-falsy-данных

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

1
2
3
if (is_null($data)) {
    die(‘Could not load data’);
}

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


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

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

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

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