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

Автор: Aport Суббота, Январь 31st, 2015 Нет комментариев

Рубрика: Язык PHP

У всех были ситуации, когда нужно отследить, где происходит ошибка в коде, тут как бы все просто — заглянул в лог апача, увидел адрес пхп-скрипта и номер строки, дальше начинаешь писать 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.remote_enable=On
xdebug.remote_host=localhost
xdebug.remote_port=9000
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-скрипт в указанном Вами месте и покажет Вам трэйс и параметры (данные):

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

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

по мотивам: 12

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

$ export XDEBUG_CONFIG=»idekey=PHPSTORM«

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

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

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

wget —no-cookies —header «Cookie: XDEBUG_SESSION=PHPSTORM« http://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 вот тут:

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

готово. По мотивам: 12

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

aptitude install xorg openbox menu obconf obmenu
startx

и яву для PhpStorm:

aptitude install openjdk-7-jdk

 

 

Источник: yapro.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты