我目前正在学习一个大型代码库,其中涉及跨多个(大约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)
答案 0 :(得分:2)
当我问这个问题时,我误解了协议是如何工作的,并且代理不是绝对必要的。
XDebug(和DBGP protocol)根据配置的IP地址或(最近但不推荐)客户端IP,启动从服务器到客户端的连接。
此行为以下列两种方式之一启用:
?XDEBUG_SESSION_START=<something>
附加到网址<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,这是一个有争议的问题。