Использование XDebug для трассировки страницы веб-службы PHP
Я использую Eclipse и XDebug для разработки PHP-приложения, которое полагается на веб-службы. У меня есть тестовые страницы, которые потребляют мои услуги двумя способами: AJAX (используя jQuery) и cURL.
Я добавляю точки останова на страницу службы и запускаю отладчик. Когда я вызываю службу из AJAX, выполнение красиво останавливается в точке останова,и я получаю свои переменные, пошаговое управление и т. д.
но когда я вызываю сервис с помощью cURL (т. е. изнутри страницы PHP), точки останова не работает. Даже если я включу отладчик "Break at first line", я не смогу остановить выполнение при использовании cURL.
Это поведение отладчика? Должен ли я добавить hearder к моим вызовам cURL? Изменить URL-адрес? Или это ограничение XDebug?
Спасибо за ваше время и усилия, Гай!--1-->
6 ответов
Я пока не могу комментировать, поэтому публикую это как ответ.
можете ли вы отлаживать более одного запроса AJAX за один сеанс? Был ли ваш сеанс отладки все еще запущен в Eclipse, когда вы пытались отладить с помощью cURL?
описание того, как это работает для меня:
- начать сеанс отладки с простой отладки.php-файл, содержащий только
<?php
и больше ничего. Он останавливается на первой строке, вы "продолжаете" его, и он завершает выполнение. - сейчас запрос скрипт с помощью cURL (или другого браузера) добавляет ?XDEBUG_SESSION_START=ECLIPSE_DBGP к своему пути (я даже думаю, что это дополнение является необязательным)
- ваш скрипт должен отображаться в представлении отладки, остановленном в первой строке
надеюсь, что это поможет.
вот совет о том, как вызвать клиент Xdebugger из Curl без браузера:
1 - из командной строки:
curl -H "Cookie: XDEBUG_SESSION=1" http://YOUR-SITE.com/your-script.php
2-от PHP
<?php
$ch = curl_init ();
curl_setopt ($ch, CURLOPT_URL, 'http://YOUR-SITE.com/your-script.php');
curl_setopt ($ch, CURLOPT_COOKIE, 'XDEBUG_SESSION=1');
curl_exec ($ch);
?>
поэтому не имеет значения, прикрепляете ли вы" XDEBUG_SESSION=1 " к curl URL, но необходимо отправить правильный cookie вместе с запросом.
Я знаю, что это довольно старая тема, но я думал, что опубликую свой опыт для других, которые могут столкнуться с ней, как и я, с той же проблемой. Я обнаружил, что если вы отлаживаете удаленно (что я всегда делаю), есть несколько настроек, которые вы должны изменить в php.ini, чтобы сделать эту работу. Вот те, которые работали на меня:
xdebug.remote_connect_back = false
xdebug.remote_host = {client host name or IP}
первый параметр обычно "true" и говорит xdebug искать клиента по тому же IP-адресу, где HTTP-запрос рожденный. В этом случае, однако, запрос поступает с сервера, так что это не будет работать. Вместо этого вы должны использовать второй параметр, чтобы сообщить xdebug, где найти клиента. Надеюсь, это поможет сэкономить кому-то немного времени!
для запуска отладчика самым простым решением является использование подхода cookie -b XDEBUG_SESSION=ECLIPSE_DBGP
работал для меня на eclipse, см. ниже:
curl -H 'Content-type: application/json' \
-b XDEBUG_SESSION="ECLIPSE_DBGP" \
-X POST \
-d '{"uid":200, "message":"asdsad","message_type":1}'
http://daxuebao.local:8083/api/message/send
когда вы отлаживаете запрос Ajax, этот запрос отправляется браузером в том же контексте навигации, что и другой (не Ajax) запросы - вот почему он работает нормально.
Запрос, отправленный curl, находится в другом, другом контексте-и я не уверен, что вы можете подключить отладчик к этому... но, может быть...
прежде всего, вот информация, которая может оказаться полезной, цитируя отладчик xdebug по документация :
Xdebug содержит функциональность для сохранения отслеживание сеанса отладки при запуске через браузер: печенье. Эта работа вот так:
- когда переменная URL
XDEBUG_SESSION_START=name
is добавленный к URL-адресу Xdebug выдает cookie с именем "XDEBUG_SESSION
" и как значение значениеXDEBUG_SESSION_START
параметр url.- когда есть переменная GET (или POST)
XDEBUG_SESSION_START
илиXDEBUG_SESSION
cookie установлен, Xdebug будет попробуйте подключиться к debugclient.- чтобы остановить сеанс отладки (и уничтожить cookie), просто добавьте URL-адрес параметр
XDEBUG_SESSION_STOP
. Xdebug больше не будет пытаться сделать подключение к debugclient.
возможно, это может сработать, если вы установите этот cookie "вручную", отправив его allong запрос на завиток...
Я полагаю, вам сначала нужно получить его значение, как установлено Xdebug в начале сеанса отладки - повторное использование cookie у вас в вашем браузере должно быть возможно, хотя.
примечание : Я никогда не пробовал это ... если вы попробуете, и это работает, не могли бы вы подтвердить, что это работает ?
я столкнулся с той же самой проблемой. Я решил это, повернув функцию автозапуска выкл в php.ini:
xdebug.remote_autostart = 0
а затем добавление ключа API к URL-адресу webservice, который вызывает мой клиент webservice:
?XDEBUG_SESSION_START=<your API key here>
и я не уверен, что это имеет значение, но я ввел ключ API в свой отладчик (MacGDBp). Теперь отладчик запускается только при вызове сценария на стороне сервера webervice, а не при запуске клиента.
надеюсь, что это помогает.