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

StackOverflow https://stackoverflow.com/questions/2045316

Вопрос

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

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

Но когда я вызываю службу с помощью cURL (т. е.изнутри страницы PHP), точки останова не функционируют.Даже если я включу опцию отладчика "Прервать в первой строке", я не смогу остановить выполнение при использовании 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}

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top