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

вот и все дела, попробуйте, это действительно удобно!
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 вот тут:

p.s. в какой-то момент у меня как-то косячно стала работать связка xdebug + PhpStorm, на первой строке PhpStorm ловил вызов из консоли, я мог идти дальше по шагам и даже завершить вызов, но брэйкпоинты не срабатывали, поэтому, пришлось на виртуальную Debian ставить GUI:
aptitude install xorg openbox menu obconf obmenu
startx
и яву для PhpStorm:
aptitude install openjdk-7-jdk
Комментарии