Использование XDebug для отслеживания страницы веб-сервиса PHP
Вопрос
Я использую Eclipse и XDebug для разработки PHP-приложения, которое полагается на веб-сервисы.У меня есть тестовые страницы, которые используют мои сервисы двумя способами:AJAX (с использованием jQuery) и cURL.
Я добавляю точки останова на свою служебную страницу и запускаю отладчик.Когда я вызываю службу из AJAX, выполнение автоматически останавливается в точке останова, и я получаю свои переменные, пошаговое управление и т.д.
Но когда я вызываю службу с помощью cURL (т. е.изнутри страницы PHP), точки останова не функционируют.Даже если я включу опцию отладчика "Прервать в первой строке", я не смогу остановить выполнение при использовании cURL.
Это поведение отладчика?Нужно ли мне добавлять слушателя к моим вызовам cURL?Изменить URL-адрес?Или это ограничение XDebug?
Спасибо за твое время и усилия, Гай
Решение
Я пока не могу комментировать, поэтому публикую это как ответ.
Можете ли вы отладить более одного AJAX-запроса за один сеанс?Был ли ваш сеанс отладки все еще запущен в Eclipse, когда вы пытались выполнить отладку с помощью cURL?
Описание того, как это работает у меня:
- Запустите сеанс отладки с помощью простого debug.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" к URL CURL, но что необходимо, так это отправить правильный файл 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's :
Xdebug содержит функциональные возможности для отслеживания сеанса отладки при запуске через браузер:файлы cookie.Это работает вот так:
- Когда переменная URL
XDEBUG_SESSION_START=name
добавляется к URL-адресу, Xdebug отправляет файл cookie с именем "XDEBUG_SESSION
" и в качестве ценности используется ценностьXDEBUG_SESSION_START
Параметр URL.- Когда есть переменная GET (или POST)
XDEBUG_SESSION_START
или тотXDEBUG_SESSION
файл cookie установлен, Xdebug попытается подключиться к debugclient.- Чтобы остановить сеанс отладки (и уничтожить печенья) просто добавьте URL-адрес параметр
XDEBUG_SESSION_STOP
.После этого Xdebug больше не будет пытаться установить соединение с debugclient. подключение к debugclient.
Возможно, это сработало бы, если бы вы установили этот файл cookie "вручную", отправив его вместе с запросом curl...
Я полагаю, что сначала вам нужно было бы получить его значение, установленное Xdebug в начале сеанса отладки - тем не менее, должно быть возможно повторное использование файла cookie, который у вас есть в вашем браузере.
Примечание :Я никогда не пробовал этого - если вы попробуете, и это сработает, не могли бы вы, пожалуйста, подтвердить, что это сработало?
Я столкнулся с точно такой же проблемой.Я решил это, включив функцию автозапуска ВЫКЛ в php.ini:
xdebug.remote_autostart = 0
а затем добавляем ключ API к URL-адресу веб-сервиса, который вызывает мой клиент веб-сервиса:
?XDEBUG_SESSION_START=<your API key here>
и я не уверен, имеет ли это значение, но я ввел ключ API в свой отладчик (MacGDBp).Теперь отладчик запускается только при вызове серверного скрипта webervice, а не при запуске клиента.
Надеюсь, это поможет.