我正在使用Eclipse和XDebug开发依赖于Web服务的PHP应用程序。 我有以两种方式使用我的服务的测试页面:AJAX(使用jQuery)和cURL。
我将断点添加到服务页面并启动调试器。当我从AJAX调用该服务时,执行在断点处很好地停止,我得到了我的变量,逐步控制等。
但是当我使用cURL调用服务时(即在PHP页面内),断点无法正常工作。即使我打开“Break at first line”调试器选项,我也无法在使用cURL时停止执行。
它是调试器行为吗?我是否需要在cURL电话中添加听筒?改变URL?或者它是XDebug限制?
感谢您的时间和精力, 盖
答案 0 :(得分:9)
我还不能发表评论,所以我将其作为答案发布。
您可以在一个会话中调试多个AJAX请求吗? 当您尝试使用cURL进行调试时,您的调试会话是否仍在Eclipse中运行?
关于它如何对我有用的描述:
<?php
的简单debug.php文件启动调试会话。它在第一行停止,你“继续”它并完成执行。 希望有所帮助。
答案 1 :(得分:7)
以下是如何在没有浏览器的情况下从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。
答案 2 :(得分:5)
我知道这是一个非常古老的主题,但我认为我会发布我的经验给其他可能遇到它的人,就像我一样,遇到同样的问题。我发现,如果你是远程调试(我总是这样做),你需要在php.ini中更改一些设置以使其工作。以下是适用于我的那些:
xdebug.remote_connect_back = false
xdebug.remote_host = {client host name or IP}
第一个设置通常为“true”,并告诉xdebug在发出HTTP请求的同一IP地址中查找客户端。但是,在这种情况下,请求来自服务器,因此不起作用。相反,您必须使用第二个设置告诉xdebug在哪里找到客户端。希望这有助于节省一些时间!
答案 3 :(得分:3)
要触发调试器,最简单的解决方案是使用在Eclipse上为我工作的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
答案 4 :(得分:2)
当您调试Ajax请求时,浏览器会在与其他(非Ajax)请求相同的导航上下文中发送该请求 - 这就是它工作正常的原因。 / p>
curl发送的请求在另一个不同的上下文中 - 我不确定你是否可以将调试器挂钩... 但是,也许......
首先,这是一个可能有用的信息,引用Xdebug's documentation:
Xdebug包含要保留的功能 启动时跟踪调试会话 通过浏览器:cookies。这有效 像这样:
- 当网址变量
XDEBUG_SESSION_START=name
为时 附加到URL Xdebug发出一个 名称的cookie “XDEBUG_SESSION
”和价值观XDEBUG_SESSION_START
的价值 网址参数。- 当有GET(或POST)变量
XDEBUG_SESSION_START
或者 Xdebug设置了XDEBUG_SESSION
cookie 将尝试连接到debugclient。- 要停止调试会话(并销毁cookie),只需添加URL即可 参数
XDEBUG_SESSION_STOP
。 Xdebug将不再尝试制作 与debugclient的连接。
如果您“手动”设置该Cookie,并将其发送到卷曲请求中,它可能会有效...
我想你首先必须得到它的价值,正如Xdebug在调试会话开始时所设定的那样 - 尽管如此,重新使用浏览器中的cookie应该是可能的。
注意:我从来没有尝试过这个 - 如果你试试,它确实有效,请你确认它有效吗?
答案 5 :(得分:2)
我遇到了同样的问题。我通过在php.ini中启用自动启动功能关闭解决了这个问题:
xdebug.remote_autostart = 0
然后将API密钥添加到我的webservice客户端调用的webservice URL:
?XDEBUG_SESSION_START=<your API key here>
我不确定这是否重要,但我在我的调试器(MacGDBp)中输入了API密钥。现在调试器仅在调用webervice服务器端脚本时启动,而不是在客户端启动时启动。
希望这有帮助。