代码之家  ›  专栏  ›  技术社区  ›  Traveling Tech Guy

使用xdebug跟踪PHP Web服务页面

  •  7
  • Traveling Tech Guy  · 技术社区  · 14 年前

    我正在使用Eclipse和Xdebug开发一个依赖Web服务的PHP应用程序。 我有两种方式使用我的服务的测试页:Ajax(使用jquery)和Curl。

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

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

    它是调试器行为吗?我需要在我的曲线电话中加一个听者吗?更改URL?或者它是一个xdebug限制?

    感谢您的时间和努力, 家伙

    6 回复  |  直到 10 年前
        1
  •  9
  •   janpio WillBroadbent    14 年前

    我还不能发表评论,所以我把这作为一个答案。

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

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

    1. 使用仅包含 <?php 没有别的了。它在第一行停止,您“继续”它,它完成执行。
    2. 现在使用curl(或其他浏览器)请求脚本添加?xdebug_session_start=eclipse_dbgp到它的路径(我甚至认为这个添加是可选的)
    3. 脚本应该出现在第一行停止的调试视图中

    希望这有帮助。

        2
  •  7
  •   Michel Gokan Khan    10 年前

    以下是有关如何在不使用浏览器的情况下从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与请求一起发送。

        3
  •  5
  •   Javadecaf    11 年前

    我知道这是一条很古老的线索,但我想我会把我的经验发布给其他可能遇到的人,就像我遇到的一样,有同样的问题。我发现,如果您正在远程调试(我一直这样做),那么您必须在php.in i中更改几个设置才能使其正常工作。以下是为我工作的:

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

    第一个设置通常为“真”,并告诉xdebug在发起HTTP请求的同一IP地址查找客户机。然而,在这种情况下,请求来自服务器,所以这不起作用。相反,您必须使用第二个设置来告诉xdebug在哪里找到客户机。希望这能帮你节省一点时间!

        4
  •  3
  •   perror    10 年前

    要触发调试器,最简单的解决方案是使用cookie方法 -b XDEBUG_SESSION=ECLIPSE_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
    
        5
  •  2
  •   Pascal MARTIN    14 年前

    调试Ajax请求时,浏览器将在与另一个相同的导航上下文中发送该请求。 (非Ajax) 请求——这就是它工作正常的原因。


    curl发送的请求位于另一个不同的上下文中——我不确定您是否可以将调试器挂钩到该上下文中… 但是,也许…

    首先,这里有一个信息可能会有帮助,引用 Xdebug's documentation :

    xdebug包含要保留的功能 启动时跟踪调试会话 通过浏览器:cookies。这作品 这样地:

    • 当URL变量 XDEBUG_SESSION_START=name 是 附加到URL的xdebug发出 有名字的饼干 “ XDEBUG_SESSION “作为价值, 价值观 XDEBUG_SESSION_START URL参数。
    • 当存在get(或post)变量时 xdebug_会话开始 XDebug会议 设置了cookie,xdebug 将尝试连接到DebugClient。
    • 要停止调试会话(并销毁cookie),只需添加URL 参数 XDEBUG_SESSION_STOP . xdebug将不再尝试 到DebugClient的连接。

    如果你“用手”设置这个cookie,发送它来分配curl请求,它可能会工作…

    我想您首先必须得到它的值,正如xdebug在调试会话开始时所设置的那样——但是,使用浏览器中的cookie应该是可能的。

    注:我从来没有试过这个——如果你试过,而且它能用,你能确认它能用吗?

        6
  •  2
  •   matt    14 年前

    我也遇到了同样的问题。我通过转动自动启动功能解决了这个问题。 远离的 在PHP.ini中:

    xdebug.remote_autostart = 0
    

    然后将API密钥添加到我的WebService客户端调用的WebService URL中:

    ?XDEBUG_SESSION_START=<your API key here>
    

    我不确定这是否重要,但我将API密钥输入了我的调试器(macgdbp)。现在,调试器仅在调用WebService服务器端脚本时启动,而不是在启动客户端时启动。

    希望这有帮助。