使用 XDebug 跟踪 PHP Web 服务页面
题
我正在使用 Eclipse 和 XDebug 来开发依赖于 Web 服务的 PHP 应用程序。我的测试页面以两种方式使用我的服务:AJAX(使用 jQuery)和 cURL。
我将断点添加到我的服务页面并启动调试器。当我从 AJAX 调用服务时,执行在断点处很好地停止,并且我得到了变量、逐步控制等。
但是当我使用 cURL 调用服务时(即从 PHP 页面内),断点无法运行。即使我打开“在第一行中断”调试器选项,在使用 cURL 时也无法停止执行。
这是调试器行为吗?我需要在 cURL 调用中添加侦听器吗?修改网址?还是 XDebug 的限制?
感谢您的时间和精力,伙计
解决方案
我还不能发表评论,所以我将其发布为答案。
您可以在一个会话中调试多个 AJAX 请求吗?当您尝试使用 cURL 进行调试时,您的调试会话是否仍在 Eclipse 中运行?
关于它如何为我工作的描述:
- 使用一个简单的 debug.php 文件启动调试会话,该文件仅包含
<?php
没有别的。它停在第一行,您“继续”它并完成执行。 - 现在使用 cURL (或其他浏览器)请求脚本,将 ?XDEBUG_SESSION_START=ECLIPSE_DBGP 添加到其路径(我什至认为此添加是可选的)
- 您的脚本应该显示在第一行停止的调试视图中
希望这有帮助。
其他提示
下面是关于如何从卷曲触发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服务器端脚本调用,而不是在客户端被启动。
希望这有助于。