Использование 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?

описание того, как это работает для меня:

  1. начать сеанс отладки с простой отладки.php-файл, содержащий только <?php и больше ничего. Он останавливается на первой строке, вы "продолжаете" его, и он завершает выполнение.
  2. сейчас запрос скрипт с помощью cURL (или другого браузера) добавляет ?XDEBUG_SESSION_START=ECLIPSE_DBGP к своему пути (я даже думаю, что это дополнение является необязательным)
  3. ваш скрипт должен отображаться в представлении отладки, остановленном в первой строке

надеюсь, что это поможет.


вот совет о том, как вызвать клиент 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, а не при запуске клиента.

надеюсь, что это помогает.