Php 通过ssh隧道转发端口9000的xdebug远程调试-如何使其工作?

Php 通过ssh隧道转发端口9000的xdebug远程调试-如何使其工作?,php,xdebug,eclipse-pdt,Php,Xdebug,Eclipse Pdt,我在AmazonEC2云中的“AmazonLinux”(源自Centos)32位实例上运行XAMPP1.7.3a。我下载/构建/安装了XDEBUG 2.1.0。phpinfo()输出中的相关项如下所示: Directive Local Value Master Value xdebug.idekey ECLIPSE_DBGP ECLIPSE_DBGP xdebug.default_enable

我在AmazonEC2云中的“AmazonLinux”(源自Centos)32位实例上运行XAMPP1.7.3a。我下载/构建/安装了XDEBUG 2.1.0。phpinfo()输出中的相关项如下所示:

Directive                         Local Value  Master Value
xdebug.idekey                     ECLIPSE_DBGP ECLIPSE_DBGP
xdebug.default_enable             On           On
xdebug.remote_autostart           On           On
xdebug.remote_connect_back        Off          Off
xdebug.remote_cookie_expire_time  3600         3600
xdebug.remote_enable              On           On
xdebug.remote_handler             dbgp         dbgp
xdebug.remote_host                127.0.0.1    127.0.0.1
xdebug.remote_mode                req          req
xdebug.remote_port                9000         9000
xdebug.remote_log                 /opt/lampp/logs/xdebug_log
                                               /opt/lampp/logs/xdebug_log
我使用PuTTY版本0.60中的SSH客户端,从运行XP SP3的Windows笔记本电脑访问Linux机箱。我还在笔记本电脑上安装了EclipsePDT(Helios Service Release 1构建id:20100917-0705),我想我已经正确配置了它,可以使用端口9000进行XDEBUG远程调试。我说我想,因为我很难弄清楚如何做到这一点,以及通常如何使用EclipsePDT。但我确实成功地对其进行了配置,并使用端口9000在本地主机(127.0.0.1)上使用XAMPP for Windows 1.7.3对网页运行的PHP代码进行了“远程”调试。PDT能够调试的笔记本电脑上服务器的phpinfo()输出与上述相同,除了:

xdebug.idekey       my_username     no value
xdebug.remote_host  localhost       localhost
xdebug.remote_log   no value        no value
我很确定这些差异与问题无关。事实上,xdebug.idekey最初是Linux上的“root novalue”,然后我通过编辑php.ini并在启动apache的sudo-ed脚本中设置环境变量DBGP_idekey,将其更改为ECLIPSE_DBGP,这是徒劳的

我在笔记本电脑和Linux机箱之间安装了防火墙和NAT路由器。因此,我试图通过PuTTY ssh隧道使用端口转发来让Linux XDEBUG与Windows PDT对话。我使用X11转发PuTTY已经有几个月了,一点问题也没有。我在PuTTY中设置了通道,本地端口9000转发到Linux盒上的端口9000,Linux盒上的端口9000转发到127.0.0.1上的端口9000,PuTTY通道面板显示:

L9000  host...amazonaws.com:9000
R9000  127.0.0.1:9000
设置隧道时,查看PuTTY事件日志,似乎没有问题:

2010-11-16 18:07:59 Local port 9000 forwarding to host...amazonaws.com:9000
2010-11-16 18:07:59 Requesting remote port 9000 forward to 127.0.0.1:9000
2010-11-16 18:07:59 Remote port forwarding from 9000 enabled
但是,当我转到PDT并在指定远程web服务器的配置上单击Debug时,PDT会在右下角显示后台活动,该活动停留在57%,如果我单击图标转到进度视图,则会显示“启动:等待XDebug会话”

发生这种情况时,PuTTY事件日志显示:

2010-11-16 19:05:42 Received remote port 9000 open request from 127.0.0.1:54474
2010-11-16 19:05:42 Attempting to forward remote port to 127.0.0.1:9000
2010-11-16 19:05:42 Forwarded port opened successfully
2010-11-16 19:05:42 Opening forwarded connection to host...amazonaws.com:9000
2010-11-16 19:05:42 Forwarded connection refused by server: Connect failed [Connection refused]
2010-11-16 19:05:42 Forwarded port closed
在Linux框中,/var/log/secure只显示:

Nov 16 19:01:51 ip-10-194-9-67 sshd[14555]: error: connect_to host...amazonaws.com port 9000: failed.
我已经检查了我的/etc/ssh/sshd_配置,我认为这没问题,甚至将其显式更改为“AllowtcForwarding yes”,尽管这应该是默认设置。在我寻找解决方案的web搜索中,我确实遇到了一个问题,最终的答复中说,sshd需要解析主机名,这一点相当隐晦:

这似乎解决了问题: 主机名一直是域服务,因为我总是 认为我的路由器是domain.com…所以在运行之后
hostname domain.com
…砰!它终于起作用了

我想有时候它太简单了。sshd必须解析domain.com 到我的路由器,因此连接失败

我听上去这可能与我的问题有关,但对我来说毫无意义,而且因为它非常古老,作者似乎也不理解它,我想我应该在这里而不是那里问

我确实注意到,差不多一年前在这个论坛上问了一个问题,只得到了一个0值的回答,大概是因为这个问题太缺乏细节以至于无法回答。我希望这一次有足够的信息,而且不会太长,这样有人可以引导我正确。在阅读了常见问题解答和如何提问之后,我并不完全清楚论坛的正确用法是在原始问题下发布一些内容相同但问得不好的问题,还是发布这个新问题——我相信有人会让我知道什么是正确的选择:-)


我对这件事一直很着迷,我怀疑这对有经验的人来说是显而易见的。我对这些东西(PHP、web编程、网络管理员和这个论坛)都很熟悉,但不熟悉老式的C编程和用户级Linux和Windows设置。

多么尴尬啊,显然我的端口转发设置只有网络noob才会做?我想我已经决定,由于web服务器上运行的Xdebug需要与笔记本电脑上的PDT调试器客户端通信,笔记本电脑上的PDT调试器客户端也需要与服务器上的Xdebug通信,并且只有一个端口号(9000),因此我需要将本地端口9000转发到远程端口9000,并将远程端口9000转发到本地端口9000;我混淆了通信量的方向和客户端发起到服务器端正在侦听的特定端口的(双向)连接的是哪一方

似乎发生的是,运行在笔记本电脑上的PDT调试器在等待运行在Linux上的Xdebug建立连接时卡住了。因为我想不出Xdebug需要监听端口9000,等待PDT调试器启动连接的情况(而是等待PDT调试器通过其打开的端口9000已建立的连接向其发送命令,当它在请求中看到XDEBUG_SESSION参数时),我决定不再将本地端口9000转发到远程端口9000。我这样做了,突然,PDT接收到了从Linux服务器发送的连接,调试从那里正常进行

但我仍然不清楚的是,为什么额外的转发会造成问题。难道不同主机上的一对程序不可能运行,根据状态的不同,有时一个是侦听器,有时另一个是侦听器吗?只要转发不会导致它们都尝试在主机上侦听吗在同一时间同一个港口,我希望一切都会好起来

最重要的是,由于我做了一个简化,现在事情似乎正在运行,但我想理解为什么不需要这样做