7

我正在使用 Eclipse 和 XDebug 开发依赖于 Web 服务的 PHP 应用程序。我有以两种方式使用我的服务的测试页面:AJAX(使用 jQuery)和 cURL。

我向我的服务页面添加断点并启动调试器。当我从 AJAX 调用服务时,执行会在断点处很好地停止,并且我会得到我的变量、逐步控制等。

但是当我使用 cURL(即从 PHP 页面中)调用服务时,断点无法运行。即使我打开“Break at first line”调试器选项,使用 cURL 时也无法停止执行。

它是调试器行为吗?我需要在我的 cURL 通话中添加听众吗?更改网址?还是它是 XDebug 限制?

谢谢你的时间和精力,盖伊

4

6 回答 6

9

我还不能发表评论,所以我将其发布为答案。

您可以在一个会话中调试多个 AJAX 请求吗?当您尝试使用 cURL 进行调试时,您的调试会话是否仍在 Eclipse 中运行?

关于它如何为我工作的描述:

  1. 使用仅包含 a<?php而没有其他内容的简单 debug.php 文件启动调试会话。它在第一行停止,您“继续”它并完成执行。
  2. 现在使用 cURL(或其他浏览器)请求脚本,将 ?XDEBUG_SESSION_START=ECLIPSE_DBGP 添加到其路径(我什至认为这个添加是可选的)
  3. 您的脚本应该显示在第一行停止的调试视图中

希望这会有所帮助。

于 2010-01-17T16:13:17.857 回答
9

这是关于如何在没有浏览器的情况下从 Curl 触发 Xdebugger 客户端的提示:

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”附加到 CURL URL 并不重要,但需要的是与请求一起发送适当的 cookie。

于 2011-10-17T19:28:32.480 回答
5

我知道这是一个非常古老的线程,但我想我会将我的经验发布给其他可能遇到它的人,就像我一样,遇到同样的问题。我发现,如果您在远程调试(我总是这样做),您必须在 php.ini 中更改一些设置才能使其正常工作。以下是对我有用的:

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

第一个设置通常为“true”,并告诉 xdebug 在与 HTTP 请求发起的 IP 地址相同的 IP 地址上查找客户端。然而,在这种情况下,请求来自服务器,所以这不起作用。相反,您必须使用第二个设置来告诉 xdebug 在哪里可以找到客户端。希望这有助于节省一些时间!

于 2013-01-20T04:06:39.657 回答
3

-b XDEBUG_SESSION=ECLIPSE_DBGP要触发调试器,最简单的解决方案是使用在 Eclipse 上为我工作的 cookie 方法,见下文:

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
于 2014-03-29T21:13:04.900 回答
2

当您调试 Ajax 请求时,该请求由浏览器发送,在与其他(非 Ajax)请求相同的导航上下文中——这就是它工作正常的原因。


curl 发送的请求在另一个不同的上下文中-我不确定您是否可以将调试器挂钩...但是,也许...

首先,引用Xdebug 的文档,这里有一个可能有用的信息:

Xdebug 包含通过浏览器启动时跟踪调试会话的功能:cookie。这像这样工作:

  • 当 URL 变量XDEBUG_SESSION_START=name附加到 URL 时,Xdebug 会发出一个名为“”的 cookie,并将 URL 参数XDEBUG_SESSION的值作为值。XDEBUG_SESSION_START
  • 当有 GET(或 POST)变量XDEBUG_SESSION_STARTXDEBUG_SESSION设置了 cookie 时,Xdebug 将尝试连接到调试客户端。
  • 要停止调试会话(并销毁 cookie),只需添加 URL 参数XDEBUG_SESSION_STOP。Xdebug 将不再尝试与调试客户端建立连接。

如果你“手动”设置那个cookie,也许它可能会起作用,沿着curl请求发送它......

我想你首先必须得到它的值,正如 Xdebug 在调试会话开始时设置的那样——不过,重新使用浏览器中的 cookie 应该是可能的。

注意:我从来没有尝试过这个——如果你尝试了,它有效,你能确认它有效吗?

于 2010-01-11T22:16:22.473 回答
2

我遇到了同样的问题。我通过在 php.ini 中关闭自动启动功能来解决它​​:

xdebug.remote_autostart = 0

然后将 API 密钥添加到我的 Web 服务客户端调用的 Web 服务 URL:

?XDEBUG_SESSION_START=<your API key here>

我不确定这是否重要,但我将 API 密钥输入到我的调试器(MacGDBp)中。现在调试器仅在调用 webervice 服务器端脚本时启动,而不是在客户端启动时启动。

希望这可以帮助。

于 2010-06-22T03:35:23.900 回答