使用XDebug跟踪PHP web服务页面
我正在使用Eclipse和XDebug开发一个依赖于web服务的PHP应用程序。 我有两种使用我的服务的测试页面:AJAX(使用jQuery)和cURL 我将断点添加到我的服务页面并启动调试器。当我从AJAX调用服务时,执行会在断点处很好地停止,我会得到变量、逐步控制等 但是,当我使用cURL(即从PHP页面中)调用服务时,断点无法正常工作。即使打开“第一行中断”调试器选项,在使用cURL时也无法停止执行 这是调试器行为吗?我需要在我的通话中添加听者吗?更改URL?还是XDebug的限制 谢谢你的时间和努力,使用XDebug跟踪PHP web服务页面,php,eclipse,debugging,curl,xdebug,Php,Eclipse,Debugging,Curl,Xdebug,我正在使用Eclipse和XDebug开发一个依赖于web服务的PHP应用程序。 我有两种使用我的服务的测试页面:AJAX(使用jQuery)和cURL 我将断点添加到我的服务页面并启动调试器。当我从AJAX调用服务时,执行会在断点处很好地停止,我会得到变量、逐步控制等 但是,当我使用cURL(即从PHP页面中)调用服务时,断点无法正常工作。即使打开“第一行中断”调试器选项,在使用cURL时也无法停止执行 这是调试器行为吗?我需要在我的通话中添加听者吗?更改URL?还是XDebug的限制 谢谢你
Guy在调试Ajax请求时,浏览器会在与其他(非Ajax)请求相同的导航上下文中发送一个请求,这就是它工作正常的原因
curl发送的请求位于另一个不同的上下文中——我不确定您是否可以将调试器挂接到该上下文中。。。但是,也许 首先,这里有一个可能证明有用的信息,引用: Xdebug包含要保留的功能 启动时跟踪调试会话 通过浏览器:cookies。这很有效 像这样:
- 当URL变量
为 附加到URL的Xdebug发出 有名字的饼干 “XDEBUG\u SESSION\u START=name
”并作为值XDEBUG\u SESSION
URL参数XDEBUG\u SESSION\u START的值
- 当存在GET(或POST)变量
或XDEBUG\u SESSION\u START
cookie已设置,XDEBUG 将尝试连接到调试客户端XDEBUG\u会话
- 要停止调试会话(并销毁cookie),只需添加URL
参数
。 Xdebug将不再尝试 与调试客户端的连接XDEBUG\u SESSION\u STOP
注意:我从来没有试过这个——如果你试过,并且成功了,你能确认它成功了吗?我还不能评论,所以我将此作为一个答案发布 能否在一个会话中调试多个AJAX请求? 当您尝试使用cURL进行调试时,调试会话是否仍在Eclipse中运行 关于它如何为我工作的说明:
,我遇到了同样的问题。我通过在php.ini中关闭自动启动功能解决了这个问题:
xdebug.remote_autostart = 0
然后将API密钥添加到我的webservice客户端调用的webservice URL:
?XDEBUG_SESSION_START=<your API key here>
?XDEBUG\u会话\u启动=
我不确定这是否重要,但我将API密钥输入了我的调试器(MacGDBp)。现在,调试器仅在调用WebService服务器端脚本时启动,而不是在启动客户端时启动
希望这有帮助。以下是如何在不使用浏览器的情况下从Curl触发Xdebugger客户端的提示:
1-从命令行:
curl -H "Cookie: XDEBUG_SESSION=1" http://YOUR-SITE.com/your-script.php
2-来自PHP
因此,将“XDEBUG_SESSION=1”附加到CURL URL并不重要,但必要的是将适当的cookie与请求一起发送。我知道这是一个非常古老的线程,但我想我会将我的经验发布给其他可能遇到它的人,就像我一样,有同样的问题。我发现,如果要进行远程调试(我总是这么做),则必须在php.ini中更改一些设置才能使其正常工作。以下是对我有效的方法:
xdebug.remote_connect_back = false
xdebug.remote_host = {client host name or IP}
第一个设置通常为“true”,并告诉xdebug在HTTP请求发起的同一IP地址查找客户机。但是,在本例中,请求来自服务器,因此无法工作。相反,您必须使用第二个设置来告诉xdebug在哪里可以找到客户机。希望这有助于节省一些时间 要触发调试器,最简单的解决方案是使用cookie方法-b XDEBUG\u SESSION=ECLIPSE\u 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
不起作用。我已经在每个cURL URL中添加了?XDEBUG\u SESSION\u START=ECLIPSE\u DBGP&KEY=12632513094615(我从ECLIPSE启动的URL中获取值-键每次都会更改)。我验证了这是进入cURL的URL-没有用。这是您在eclipse上使用的相同会话名称吗?使用cookie cURL_setopt($ch,CURLOPT_cookie,“XDEBUG_session=1”)或发送URL参数XDEBUG_session_START来调用cURL对我来说从来都不起作用。谢谢您尝试Jan.是的,我可以调试多个Ajax调用,是的,我的调试会话仍在Eclipse中运行。正如您在下面看到的,我已经尝试将XDEBUG\u SESSION\u START=ECLIPSE\u DBGP添加到我的cURL调用中,但没有效果。@Traveling Tech Guy:我明天会在工作中尝试。我99%确信这对我有效,所以我们也会让它对你有效。是的,再试一次,它就有效了。您不需要密钥,XDEBUG\u SESSION\u START就足够了。然后,它在每个浏览器和连接到调试会话正在运行的服务器的每种方式中都能工作。如果cURL请求真的做了正确的事情,你检查了你的请求日志了吗?只有XDEBUG\u SESSION\u START
对我不起作用,我必须向url添加一个关键参数GET/movie?XDEBUG\u SESSION\u START=ECLIPSE\u DBGP&KEY=14297182897315
起作用。