远程服务器的 Xdebug 未连接

Posted

技术标签:

【中文标题】远程服务器的 Xdebug 未连接【英文标题】:Xdebug for remote server not connecting 【发布时间】:2011-12-24 09:17:45 【问题描述】:

我希望一个使用不同计算机的团队能够在 远程 服务器上调试 php,但我很难让 Xdebug 在 NetBeans 7.0.1 中工作。我尝试了许多在线技巧,但都无济于事。

作为记录,我已在运行 WampServer 的 Windows 7 机器上成功安装了 Xdebug 本地。所以我可以在 NetBeans 中使用断点调试 PHP,前提是我将 Project Properties->Run Configuration->Run As 属性设置为 Local Web Site .但是,如上所述,我的目标是在 远程网站 上在 NetBeans 中进行调试。

我的服务器是 Ubuntu 11.04 机器。我已经使用http://www.xdebug.org/find-binary.php 的输出将正确的二进制文件放在机器上。我已经修改了我能找到的所有php.ini 文件(在php5/apache2php5/cli 目录中)以包含这些行:

zend_extension="/usr/lib/php5/20090626+lfs/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9000

如果我查看phpinfo.php 网页,它会显示:

This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
    with Xdebug v2.1.2, Copyright (c) 2002-2011, by Derick Rethans

所以 Xdebug 似乎安装正确。不过,当我尝试在 NetBeans 中进行调试时,我会收到无休止的状态栏消息 Waiting For Connection (netbeans-xdebug)。当我点击停止按钮时,我得到 X 秒内未检测到来自 xdebug 的连接。原因可能是 xdebug 未安装或配置不正确

也许我在这里将本地设置与服务器设置混淆了? A post 说 xdebug.remote_host 应该设置为运行 NetBeans 的机器的IP,但我希望团队能够使用具有不同 IP 地址的机器进行调试。问题可能是端口 9000,但我检查过它没有被阻塞。

任何可以澄清这一点的帮助将不胜感激!

【问题讨论】:

使用xdebug.ide_key并将其设置为一些复杂的值应该用作密码iirc。 多年后再次遇到此问题,该问题是由阻止运行 Xdebug 的服务器联系我的开发计算机的防火墙设置引起的(请参阅@Linus Kleen 的回答)。所以检查你的防火墙。 是的,最终需要某种 NA(P)T 才能将来自开发服务器的传入外部连接转发到局域网中的计算机。 【参考方案1】:

运行 PHP(和 XDebug)的服务器需要能够连接到您的工作站/桌面。

因此,您需要通过告诉它连接到特定 IP 地址 (xdebug.remote_host) 或自动“连接回”(xdebug.remote_connect_back) 来相应地设置服务器。不过,后者有一些安全隐患。这些是in the manual 的概述。

【讨论】:

非常感谢!现在可以了!我只是将配置行 xdebug.remote_connect_back=1 添加到 php.ini 文件中。还要感谢您注意安全隐患。 检查文档,xdebug.remote_host 设置似乎只接受一个地址,并且对于许多具有不同 IP 地址的团队成员,在我看来 xdebug.remote_connect_back=1 是唯一有效的设置。 您可以设置多个具有专用php.ini 的虚拟主机来规避连接回问题。我们的开发部门就是这样设置的。 @user269867 this question 有帮助吗? @ButtleButkus 简而言之,如果机器 A 需要通过端口 9000 连接到 B,但该端口被阻塞,它建立一个普通的 SSH会话并指示 SSH 客户端(在机器 A 上)本地设置端口 9000。然后通过 SSH 隧道连接到该本地端口的连接到目标机器 B。评论区已经没有多少空间了;如果您需要更多详细信息,请提出相关问题。【参考方案2】:

您要启动什么页面扩展来开始调试?我记得我发疯了,并且在 XDebug 的所有设置都运行良好的情况下度过了不眠之夜。问题是我不是从.PHP 开始,而是从.html 开始。

如果您正在尝试使用 .PHP 文件开始调试。

【讨论】:

我有一个 .PHTML 文件作为启动文件。 NetBeans 将其识别为 PHP 文件,至少从其图标来看。我尝试更改为 .PHP,但没有成功。不过感谢您的提示!【参考方案3】:

关键指令是这样的:

xdebug.remote_connect_back = On

这允许网络服务器连接到任何要求调试会话的计算机。这样您就不必对 IP 地址进行硬编码,并且能够共享 Xdebug。该指令在早期版本中不存在,并且经常从教程和文档中省略。

您还需要验证每台客户端计算机是否接受到端口 9000 (xdebug.remote_port) 的传入连接。这包括配置防火墙并确保调试器客户端已启动并运行

【讨论】:

谢谢。我已经阅读了很多 Xdebug 文档,但不知何故忽略了 xdebug.remote_connect_back 设置。由于 NetBeans 本身会生成带有建议的 php.ini 设置的帮助消息,因此我认为这是为这些设置找到正确值的问题,而不是添加另一个新设置行。 我不得不关闭xdebug.remote_connect_back。使用 SSH 隧道,远程机器显然应该连接到它自己的端口 9000(因此xdebug.remote_port=9000xdebug.remote_host=localhost)。因此,您不希望它尝试连接到远程 ip,例如173.12.34.25:9000,但本地主机:9000。此外,remote_host 和 connect_back 选项一起使用没有意义。【参考方案4】:

你需要设置:

xdebug.remote_host=192.168.1.104

192.168.1.104 是您使用 IDE 的客户端 IP

【讨论】:

谢谢。但是,当您有多个 IP 并且希望能够连接到 Xdebug 远程服务器时,我认为这种方法不起作用。请参阅 Linus Kleen 的上述评论。【参考方案5】:

感谢服务器端 php.ini 上的xdebug.remote_connect_back = On 我还必须使用 this plugin 让 Chrome 能够在 PhpStorm 中启动调试会话

【讨论】:

【参考方案6】:

对我来说,xdebug.remote_connect_back = On 不起作用。 我所做的是在我的客户端机器上设置 ssh 端口转发。

远程机器上的xdebug配置:

xdebug.remote_enable=1
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_autostart=1
xdebug.remote_handler = dbgp
xdebug.remote_mode = req

客户端机器上的转发端口:

ssh -g -N -lusername -R9000:127.0.0.1:9000 [remote.host.ip]

必须允许远程机器上的 shell 访问。

【讨论】:

我相信这被称为 SSH 隧道,而不是端口转发,尽管它有点相似。我认为“端口转发”通常是指面向公众的路由器,配置为根据流量用于哪个端口,将流量发送到其专用网络内的某些机器。我用它在我的家用机器上设置了一个网络服务器。端口 80 (http) 的流量会自动发送到那台机器(而不是我室友的)。 太好了,这行得通,你能解释一下发生了什么吗,因为我之前使用过类似的 ssh 命令来为服务器创建代理,但那个解决方案没有用。【参考方案7】:

就我而言,这些命令帮助了我:

xdebug.remote_enable = On
xdebug.remote_autostart=1

注意:即使由于 'xdebug.remote_autostart=1' 导致 GET/POST/COOKIE 变量不存在,调试器也会工作

【讨论】:

【参考方案8】:

我在尝试配置 docker 时遇到了几次同样的问题,经过多次挠头后,我意识到这是解决问题的方法。所以我决定把这个放在这里,作为我未来自己的答案。

大多数时候 Dockerfile 将这个语句添加到 php.ini:

xdebug.remote_connect_back     = on

这将导致一切看起来都很好,但不知何故,PHP 风暴实际上没有捕获任何调试连接。用以下内容替换上面的行会立即为我解决问题。

xdebug.remote_connect_back     = 0
xdebug.remote_host             = host.docker.internal

当然,在那之后你仍然需要运行: $ docker-compose down $ docker-compose build$ docker-compose up -d

注意:在 Linux 上 host.docker.internal 将不起作用。您可以改用172.17.0.1。 (注意不是127.0.0.1,我一直以为是因为我有点不习惯)

【讨论】:

那个host.docker.internal bit...我现在可以吻你了。 那只适用于 Mac 或 Windows,但不适用于主要使用它的 Linux……我不敢相信这种事情……这让我很生气…… 我尝试了我认为是 host.docker.internal (172.17.0.1) 的 ip,但没有成功;主机名确实可以!谢谢! @matiaslauriti 在 linux 这对我有用:xdebug.remote_host=172.17.0.1 @JulesColle 仍然是不,那是你为那个 docker 分配的 ip...如果我必须与团队分享,他们将不得不输入他们的 IP...这是不-不...【参考方案9】:

Xdebug 3 远程调试升级指南

总结:https://xdebug.org/docs/upgrade_guide

所需的 PHP 配置更改/添加:

删除xdebug.(remote_enable|default_enable|profiler_enable|auto_trace|coverage_enable) 添加xdebug.mode=debug或使用develop|coverage|gcstats|profile 添加xdebug.start_with_request=yes xdebug.remote_autostartxdebug.mode=debug 替换为 xdebug.start_with_request=yes xdebug.remote_host 替换为 xdebug.client_host xdebug.remote_portxdebug.client_port 替换或在 IDE 设置中使用新的默认设置(更多内容见下文)

新配置示例

xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.idekey=myKey
xdebug.client_host=x.y.z.a
xdebug.remote_handler=dbgp

在哪里

x.y.z.a = 您的 IDE 主机 myKey = 您在 IDE 中配置的密钥

所需的 IDE 配置更改/添加:

在上面的配置中将remote_port 设置为9003(xdebug 的新默认端口)或将xdebug.client_port 设置为9000 以保留旧默认值

【讨论】:

非常正确的答案;谢谢...在我的情况下,我有带 Php7.3.13、Netbeans 8.2 和 IIS 10 的 Win 10(浏览器是带有 netbeans 扩展和 FF 的 Chrome)...然后我安装了 xdebug(使用向导)并配置如下: 只想在 Xdebug 3 中添加它 - 我们应该使用 xdebug.discover_client_host=1 而不是 xdebug.remote_connect_back @Brad,我正在使用 PHP5.6 和 XDebug2.5.5 我的情况如何配置。你能看看***.com/questions/70092201/…【参考方案10】:

Brad 对 xdebug 3 的回答非常正确;谢谢......在我的情况下,我有 Php7.3.13 的 Win 10, Netbeans 8.2 和 IIS 10(eindia.com 是众多网站之一)(浏览器是带有 netbeans 扩展和 FF 的 Chrome)...没有 Xampp、Wampp、Lampp... 然后我安装了 xdebug(使用向导)和配置如下:

[xDebug]
zend_extension = "C:\Program Files\PHP\v7.3\ext\php_xdebug-3.0.2-7.3-vc15-nts-x86_64.dll"
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.remote_autostart=on
xdebug.remote_enable=on
xdebug.remote_handler="dbgp"
xdebug.client_host="eindia.com"
;xdebug.remote_host=192.168.1.5
;xdebug.remote_connect_back=1
xdebug.client_port=9003
;xdebug.remote_mode=req
xdebug.idekey="netbeans-xdebug"  

它的工作就像魅力。

【讨论】:

【参考方案11】:

如果你使用的是 xdebug 3,你需要知道一些变量被重命名了。阅读:https://xdebug.org/docs/upgrade_guide

php.ini 配置对我有用:

[xdebug]
xdebug.mode=debug
zend_extension="C:/wamp64/bin/php/php7.4.26/ext/php_xdebug.dll"
xdebug.idekey=PHPSTORM
xdebug.client_host= "localhost"
xdebug.client_port=9003

PHPstorm settings

【讨论】:

以上是关于远程服务器的 Xdebug 未连接的主要内容,如果未能解决你的问题,请参考以下文章

Phpstorm + xdebug:尽管服务器主机可能不是本地主机,但远程主机配置为“localhost”

在远程服务器上的Docker内部进行Xdebug远程调试

远程服务器上 Docker 内的 Xdebug 远程调试

使用 XDebug 进行 PHP 远程调试

启用 xdebug 远程调试使 apache 服务器非常慢

使用 PHPStorm 解决 PHPUnit xdebug 远程调试问题