Использование XDebug для отслеживания страницы веб-сервиса PHP

Я использую Eclipse и XDebug для разработки PHP-приложения, которое полагается на веб-службы. У меня есть тестовые страницы, которые потребляют мои услуги двумя способами: AJAX (с использованием jQuery) и cURL.

Я добавляю точки останова на свою служебную страницу и запускаю отладчик. Когда я вызываю службу из AJAX, выполнение останавливается красиво в точке останова, и я получаю свои переменные, пошаговое управление и т. Д.

Но когда я вызываю службу с использованием cURL (т. Е. Из PHP-страницы), точки останова не работают. Даже если я включу опцию «Break on first line» debugger, я не могу остановить выполнение при использовании cURL.

Это поведение отладчика? Нужно ли добавлять слушателя к моим вызовам cURL? Изменить URL? Или это ограничение XDebug?

Спасибо за ваше время и усилия, Гай

Я еще не могу комментировать, поэтому я отправляю это как ответ.

Вы можете отлаживать более одного запроса AJAX за один сеанс? Был ли ваш сеанс отладки еще запущен в Eclipse, когда вы пытались отлаживать использование cURL?

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

  1. Запустите сеанс отладки с помощью простого файла debug.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» к URL CURL, но необходимо отправить правильное cookie вместе с запросом.

Я знаю, что это довольно старый поток, но я думал, что отправлю свой опыт другим, которые могут столкнуться с ним, как и я, с той же проблемой. Я обнаружил, что если вы отлаживаете удаленно (что я всегда делаю), есть несколько настроек, которые вы должны изменить в php.ini, чтобы сделать эту работу. Вот те, которые работали на меня:

 xdebug.remote_connect_back = false xdebug.remote_host = {client host name or IP} 

Первая настройка обычно «истинна» и сообщает 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 содержит функциональные возможности для отслеживания сеанса отладки при запуске через браузер: файлы cookie. Это работает следующим образом:

  • Когда к URL-адресу XDEBUG_SESSION_START=name добавляется переменная URL Xdebug, XDEBUG_SESSION куки-файл с именем « XDEBUG_SESSION » и как значение значение параметра URL XDEBUG_SESSION_START .
  • Когда есть переменная GET (или POST) XDEBUG_SESSION_START или XDEBUG_SESSION cookie XDEBUG_SESSION , Xdebug попытается подключиться к debugclient.
  • Чтобы остановить сеанс отладки (и уничтожить куки), просто добавьте параметр URL XDEBUG_SESSION_STOP . Xdebug больше не будет пытаться подключиться к debugclient.

Возможно, это может сработать, если вы установите этот файл cookie «вручную», отправив его по запросу завитка …

Полагаю, вам сначала нужно получить его значение, как установлено Xdebug в начале сеанса отладки, но повторное использование cookie, которое у вас есть в вашем браузере, должно быть возможным.

Примечание. Я никогда не пробовал это – если вы попытаетесь, и это работает, не могли бы вы подтвердить, что это сработало?

Я столкнулся с этой самой точной проблемой. Я решил это, отключив функцию автозапуска в php.ini:

 xdebug.remote_autostart = 0 

а затем добавление ключа API к URL-адресу webservice, который вызывает мой клиент webservice:

 ?XDEBUG_SESSION_START=<your API key here> 

и я не уверен, что это имеет значение, но я ввел ключ API в мой отладчик (MacGDBp). Теперь отладчик запускается только тогда, когда вызывается серверный скрипт webervice, а не когда клиент запущен.

Надеюсь это поможет.