如何在多台服务器上使用XDebug?

时间:2011-05-21 02:13:33

标签: php xdebug

我目前正在学习一个大型代码库,其中涉及跨多个(大约9个)物理服务器部署的代码。由于整体架构,我无法将代码汇总到具有许多虚拟主机的一台机器上。

我觉得能够在我的IDE(NetBeans或Eclipse)中启动一个调试会话,并在我的任何一组服务器上执行代码时命中断点非常有用。这可以通过浏览服务器或服务器代码中的RPC / HTTP调用来实现。

为了实现这一点,我想我需要某种dbgp代理,它将在多个服务器之间转发调试数据(我在搜索中找到的标准dbgp代理方法是另一种方式 - 单个服务器上的多个用户)。 / p>

是否存在这样做的方法?我是否遗漏了一些明显(或微妙)的东西,这意味着我需要的不仅仅是dbgp代理?


我知道Debugging 2 servers with php's Xdebug at the same time,但是这里的解决方案完全不合适...运行8个虚拟机(或获得8个客户端计算机)不是一个可行的选择


作为一个子问题,如果我最终推出自己的开源解决方案,人们会关心我使用的语言吗? Java似乎很适合IDE集成,C / C ++对于任何非java-IDE用户可能具有较少的依赖性问题(可能是vim/xdebug

1 个答案:

答案 0 :(得分:2)

当我问这个问题时,我误解了协议是如何工作的,并且代理不是绝对必要的。

XDebug(和DBGP protocol)根据配置的IP地址或(最近但不推荐)客户端IP,启动从服务器到客户端的连接。

此行为以下列两种方式之一启用:

  • ?XDEBUG_SESSION_START=<something>附加到网址
  • 将Cookie“XDEBUG_SESSION”设置为<something>

虽然可以在浏览器和客户端之间插入一个HTTP代理来插入其中一个(或者一个浏览器插件),但对我来说更简洁的解决方案是在服务器上使用mod_rewrite。

RewriteEngine On

RewriteCond %{HTTP_COOKIE} !XDEBUG_SESSION   [NC]
RewriteRule ^(.*)$ $1?XDEBUG_SESSION_START=mod_rewrite [QSA,L]

由于mod_rewrite通常基于每个虚拟主机运行,因此需要在每个虚拟主机上启用。

NetBeans的会话名称似乎并不重要(其他IDE可能会有所不同),但可能值得将mod_rewrite的值更改为IDE生成的任何内容。如果正在使用DBGP代理,这不太可行,因为没有简单的方法将IDE会话信息绑定到重写规则中。

也就是说,使用mod_rewrite而不是使用代理拦截请求的一大优点是,它允许调试RPC调用的两端(尽管单个调试器是否喜欢多个并发连接是另一个问题)。

通过将服务器名称添加到init packets中的线程字段中,拥有一个管理来自不同服务器的流的DBGP代理仍然会很好,但是因为我还没有使用支持多个线程/服务器的调试器PHP,这是一个有争议的问题。