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

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

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

这是调试器行为吗?我需要在 cURL 调用中添加侦听器吗?修改网址?还是 XDebug 的限制?

感谢您的时间和精力,伙计

有帮助吗?

解决方案

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

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

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

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

希望这有帮助。

其他提示

下面是关于如何从卷曲触发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”卷曲URL,但必要的是与请求一起发送的cookie正确

我知道这是一个很老的线程,但我想我会后我对别人可能遇到它,像我一样,有同样问题的经验。我发现的是,如果你是远程调试(我总是这样),还有你在php.ini改变,使这项工作一对夫妇的设置。这里是为我工作的那些:

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

在第一设置通常是“真”,并告诉Xdebug的寻找客户端在该HTTP请求的同一个源的IP地址。然而,在这种情况下,请求来自服务器,这样就不会工作。相反,你必须使用第二个设置告诉Xdebug的在哪里可以找到客户。希望这有助于节省的人一点点时间!

要触发调试器中最简单的解决方案是使用cookie方法-b XDEBUG_SESSION=ECLIPSE_DBGP我制作蚀,见下文:

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 请求时,浏览器会在与另一个请求相同的导航上下文中发送该请求 (非阿贾克斯) 请求——这就是它工作正常的原因。


由curl发送的请求是在另一个不同的上下文中——我不确定你可以将调试器挂接到那个...... 但是,也许...

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

Xdebug 包含要保留的功能 启动时跟踪调试会话 通过浏览器:饼干。这有效 喜欢这个:

  • 当 URL 变量 XDEBUG_SESSION_START=name 是 附加到 URL Xdebug 会发出一个 带有名称的 cookie "XDEBUG_SESSION“,并作为值 的值 XDEBUG_SESSION_START网址参数。
  • 当存在 GET(或 POST)变量时 XDEBUG_SESSION_START 或者 XDEBUG_SESSION cookie 已设置,Xdebug 将尝试连接到 DebugClient。
  • 要停止调试会话(并销毁 cookie),只需添加 URL 参数 XDEBUG_SESSION_STOP。然后 Xdebug 将不再尝试使 与 DebugClient 的连接。

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

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

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

我就遇到了这个完全相同的问题。我解决它在php.ini中关闭自动启动功能的关闭的:

xdebug.remote_autostart = 0

,然后加入API密钥给我的web服务客户端调用WebService的URL:

?XDEBUG_SESSION_START=<your API key here>

我不知道这是否重要,但是我进入API密钥进入我的调试器(MacGDBp)。现在,调试程序会调用只有当webervice服务器端脚本调用,而不是在客户端被启动。

希望这有助于。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top