使用XDebug跟踪PHP Web服务页面

时间:2010-01-11 22:07:53

标签: php eclipse debugging curl xdebug

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

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

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

它是调试器行为吗?我是否需要在cURL电话中添加听筒?改变URL?或者它是XDebug限制?

感谢您的时间和精力, 盖

6 个答案:

答案 0 :(得分:9)

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

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

关于它如何对我有用的描述:

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

答案 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服务器端脚本时启动,而不是在客户端启动时启动。

希望这有帮助。