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

У всех были ситуации, когда нужно отследить, где происходит ошибка в коде, тут как бы все просто - заглянул в лог апача, увидел адрес пхп-скрипта и номер строки, дальше начинаешь писать 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

youtube.com/watch?v=7hFivbgIEqk

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

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