Я использую Eclipse и XDebug для разработки PHP-приложения, которое полагается на веб-службы. У меня есть тестовые страницы, которые потребляют мои услуги двумя способами: AJAX (с использованием jQuery) и cURL.
Я добавляю точки останова на свою служебную страницу и запускаю отладчик. Когда я вызываю службу из AJAX, выполнение останавливается красиво в точке останова, и я получаю свои переменные, пошаговое управление и т. Д.
Но когда я вызываю службу с использованием cURL (т. Е. Из PHP-страницы), точки останова не работают. Даже если я включу опцию «Break on first line» debugger, я не могу остановить выполнение при использовании cURL.
Это поведение отладчика? Нужно ли добавлять слушателя к моим вызовам cURL? Изменить URL? Или это ограничение XDebug?
Спасибо за ваше время и усилия, Гай
Я еще не могу комментировать, поэтому я отправляю это как ответ.
Вы можете отлаживать более одного запроса AJAX за один сеанс? Был ли ваш сеанс отладки еще запущен в Eclipse, когда вы пытались отлаживать использование cURL?
Описание того, как это работает для меня:
<?php
и ничего больше. Он останавливается на первой строке, вы «продолжаете» его и заканчиваете выполнение. Надежда помогает.
Вот подсказка о том, как запускать клиент 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
» и как значение значение параметра URLXDEBUG_SESSION_START
.- Когда есть переменная GET (или POST)
XDEBUG_SESSION_START
илиXDEBUG_SESSION
cookieXDEBUG_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, а не когда клиент запущен.
Надеюсь это поможет.