Дебагинг - от простого к удобному

У всех были ситуации, когда нужно отследить, где происходит ошибка в коде, тут как бы все просто - заглянул в лог апача, увидел адрес пхп-скрипта и номер строки, дальше начинаешь писать echo 123; print_r($abc); и таким образом находишь свой косяк, этого никто не отменяет. Однако, чтобы быстрее найти нужное место с ошибкой, а иногда просто место каким образом интерпритатор приходит к этому месту, можно воспользоваться такими способами:

debug_print_backtrace();

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

Вот еще парочка альтернатив с остановкой скрипта:

    function lebnikTrace()
    {
      $trace = debug_backtrace();
      foreach($trace as $step => $a){
        unset($a['args']);
        print_r($a);
      }
      exit;
    }
    lebnikTrace();

вариант с Exception:

    function lebnikTrace($e) {
      $trace = $e->getTrace();
      foreach($trace as $step => $a){
        unset($a['args']);
        print_r($a);
      }
      exit;
    }
    set_exception_handler('lebnikTrace');
    throw new Exception('Посмотрим трассировку стека');

казалось бы красота, что еще надо, но это еще не все. Т.е. чтобы при ошибке выбрасывать Exception автоматически, можно сделать так:

set_error_handler(create_function('$c, $m, $f, $l', 'throw new Exception($m);'), E_ALL);

Но, чтобы по настоящему ощущить все удобство дебагинга, лучше использовать отладчик Xdebug + PhpStorm

1. установим xdebug

# aptitude install php5-xdebug

2. ребутните апач и проверьте наличие установленного с поомщью например phpinfo()

3. укажим свои настройки в конфиг-файле /etc/php5/conf.d/xdebug.ini 

zend_extension=/usr/lib/php5/20090626/xdebug.so
; заставляем xdebug работать, даже если не указаны переменные GET/POST/COOKIE
xdebug.remote_autostart = On
; заставляем xdebug подключаться к удаленному IDE-Listener
xdebug.remote_enable=On

p.s. советую в php.ini выставить html_errors = Off и вот еще мои некоторые любимые настроки:

xdebug.cli_color=1 - разукрашивает консоль
xdebug.remote_host=localhost
xdebug.remote_port=9001 - для nginx
xdebug.remote_handler="dbgp"
xdebug.idekey=PHPSTORM - если решили подебажить на определенном хосте

4. снова ребутните апач. После этого перейдём к настройкам PHPStorm. Заходим в меню Run->Edit Configuration и редактируем PHP Remote Debug.

 Дебагинг - от простого к удобному

как видите, в поле Ide key я указал тоже, что и в настройках, ну а далее кликайте по правой настройки сервера, я ее обвел желтым (см. справа вверху), и перед Вам откроется такое окно:

Дебагинг - от простого к удобному

как видите, я укзал имя своего сервера (можно написать просто Вася, это только для Вас), и Host: тут я указал доменное имя сайта, который собираюсь дебажить, все остальное у меня уже было выбрано.

5. нужно добавить себе в закладки букмарклет (Вам понадобятся букмарклеты правой колонки) или установите расширение под свой браузер:

мне удобнее с помощью расширения под браузер Chrome.

Собственно все готово для тестирования, давайте теперь попробуем это дело.

1. в верхней панели PhpStorm кликните на кнопку "Listen PHP debug connections" она выглядит так Дебагинг - от простого к удобному

2. в коде своего сайта, в любой строке ставим точку остановки (Break point), кликнув справа от номера строки.

Дебагинг - от простого к удобному

3. в браузере открываем наш сайт, в моем случае домен www.site.lebnik и в панеле браузера кликаю кнопку жучка и выбираю Debug

Дебагинг - от простого к удобному

4. обновите страницу Вашего сайта и смотрите в PhpStorm, он остановит PHP-скрипт в указанном Вами месте и покажет Вам трэйс и параметры (данные):

Дебагинг - от простого к удобному

вот и все дела, попробуйте, это действительно удобно!

по мотивам: 1 - 2

p.s. а чтобы дебажить запущенный скрипт в консоли, введите:

$ export XDEBUG_CONFIG="idekey=PHPSTORM"

и затем запускайте свой скрипт:

$ php -e /home/www/test.php

Но, некоторые извращенцы как я, могут захотеть запустить скрипт по протоколу http, а сделать это можно так:

wget --no-cookies --header "Cookie: XDEBUG_SESSION=PHPSTORMhttp://www.site.ru/test.php

Или через cookies.txt файл с таким содержимым:

www.site.ru FALSE / FALSE 1379142491 XDEBUG_SESSION PHPSTORM

а теперь вызываем наш скрипт:

$ wget --load-cookies /home/www/cookies.txt http://www.site.ru/test.php

однако стоит помнить, что POST не пройдет, т.к. wget не поддерживает multipart/form-data

Дебажим на php-fpm

Т.к. по-умолчанию сервис php5-fpm крутится на 9000 порту, то поменяем для xdebug порт например на 9089:

nano /etc/php5/fpm/conf.d/xdebug.ini

после чего следует перезапустить FPM

service php5-fpm restart

и в PhpStorm пропишем 9089 вот тут:

Дебагинг - от простого к удобному

готово. По мотивам: 1 - 2

p.s. в какой-то момент у меня как-то косячно стала работать связка xdebug + PhpStorm, на первой строке PhpStorm ловил вызов из консоли, я мог идти дальше по шагам и даже завершить вызов, но брэйкпоинты не срабатывали, поэтому, пришлось на виртуальную Debian ставить GUI:

aptitude install xorg openbox menu obconf obmenu
startx

и яву для PhpStorm:

aptitude install openjdk-7-jdk

Оцени публикацию:
  • 3,15
Оценили человек: 3
Теги : xdebug virtualbox console

Похожие статьи:

Справочники и учебники:


Комментарии посетителей:
  • правильно писать так: "интерпрЕтатор"
    29 января 2016, 08:36 коммент полезен : 0 # Капитан О. (гость)
Предложения и пожелания:
Ваше имя:
Ваш E-mail:
Сколько будет Οдин + Τри
Главная
X

Новые заметки:

Про что мы забываем когда делаем оценку задачи по времени

Список вопросов для собеседования разработчика по телефону

Symfony2 авторизация без Doctrine2 для чайника

Phpstorm7 LiveEdit

Жесткий хабр или не хабр, тогда кто?

Яндекс.Деньги мошенничество

Как узнать какие страницы в поиске яндекса или это секрет

Последние комменты:

Yapro CMS:

Здравствуйте, Гость | Войти | Регистрация | Карта сайта | RSS ленты | Ошибка в тексте? Выделите её мышкой и нажмите: Ctrl + Enter

youtube.com/watch?v=7hFivbgIEqk

При полном или частичном использовании материалов данного сайта, ссылка на сайт "yapro.ru" обязательна как на источник информации.
Автоматический импорт материалов и информации с сайта запрещен.
Copyrights © 2007 - 2018 YaPro.Ru

Главная » Веб-мастеру » PHP »