Использование XDebug для отслеживания страницы веб-службы PHP - PullRequest
7 голосов
/ 12 января 2010

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

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

Но когда я вызываю службу с использованием cURL (т.е. изнутри страницы PHP), точки останова не работают. Даже если я включаю опцию отладчика «Разорвать на первой строке», я не могу остановить выполнение при использовании cURL.

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

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

Ответы [ 6 ]

9 голосов
/ 17 января 2010

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

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

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

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

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

7 голосов
/ 17 октября 2011

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

5 голосов
/ 20 января 2013

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

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

Первый параметр, как правило, имеет значение «истина» и указывает xdebug искать клиента по тому же IP-адресу, с которого исходил HTTP-запрос. В этом случае, однако, запрос приходит с сервера, поэтому он не будет работать. Вместо этого вы должны использовать второй параметр, чтобы указать xdebug, где найти клиента. Надеюсь, это поможет сэкономить немного времени!

3 голосов
/ 30 марта 2014

Для запуска отладчика самое простое решение - использовать подход 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
2 голосов
/ 22 июня 2010

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

xdebug.remote_autostart = 0

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

?XDEBUG_SESSION_START=<your API key here>

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

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

2 голосов
/ 12 января 2010

Когда вы отлаживаете запрос Ajax, тот отправляется браузером в том же контексте навигации, что и другие (не Ajax) запросы - вот почему он отлично работает.


Запрос, отправленный curl, находится в другом, ином контексте - и я не уверен, что вы можете подключить отладчик к этому ... Но, может быть ...

Прежде всего, вот информация, которая может оказаться полезной, цитируя документацию Xdebug :

Xdebug содержит функциональность для сохранения отслеживать сеанс отладки при запуске через браузер: куки. Это работает как это:

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

Возможно, это может сработать, если вы установите этот cookie "вручную", отправив его по запросу скручивания ...

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

Примечание: я никогда не пробовал это - если вы пытаетесь, и это работает, не могли бы вы подтвердить, что это работает?

...