远程服务器的Xdebug无法连接

64
我希望一个使用不同电脑的团队能够在远程服务器上调试PHP,但我很难让NetBeans 7.0.1中的Xdebug正常工作。我已经尝试了许多在线提示,但都无济于事。
值得一提的是,我已经成功地在运行WampServer的Windows 7机器上本地安装了Xdebug。因此,只要我将“项目属性->运行配置->作为本地网站运行”的属性设置为“本地网站”,我就可以在NetBeans中使用断点调试PHP。然而,如上所述,我的目标是在“远程网站”上使用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未安装或未正确配置”的信息。
也许我在混淆本地设置和服务器设置?一篇文章xdebug.remote_host应该设置为“运行NetBeans的机器的IP”,但我希望团队能够使用具有不同IP地址的机器进行调试。问题可能是端口9000,但我已经检查过它没有被阻止。
任何能够澄清这个问题的帮助都将不胜感激!

1
使用“xdebug.ide_key”并将其设置为一些复杂的值应该可以作为密码,如果我没有记错的话。 - Gelmir
1
多年后再次遇到这个问题,问题是由于防火墙设置导致服务器无法联系我的开发计算机而引起的(请参见@Linus Kleen的答案)。因此,请检查您的防火墙。 - Gruber
1
是的,最终需要某种类型的NA(P)T来将来自开发服务器的传入外部连接转发到您在本地区域网络中的计算机。 - Gelmir
12个回答

86

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

图示

因此,您需要相应地设置服务器,可以通过告诉它连接到“特定”的IP地址(xdebug.remote_host)或自动“连接回来”(xdebug.remote_connect_back)来实现。然而,后者存在一些安全问题。这些在手册中有详细说明。


1
非常感谢!现在它可以工作了!我只是在php.ini文件中添加了配置行xdebug.remote_connect_back=1。还要感谢您注意到了安全性问题。 - Gruber
2
查看文档,xdebug.remote_host 设置似乎只接受一个地址,并且由于团队成员具有不同的 IP 地址,我认为 xdebug.remote_connect_back=1 是唯一有效的设置。 - Gruber
5
您可以设置多个虚拟主机,每个虚拟主机都有专用的php.ini文件以避免连接返回问题。我们的开发部门就是这样设置的。 - Linus Kleen
2
@user269867 这个问题对你有帮助吗?(链接为http://serverfault.com/questions/178671/nginx-php-fpm-504-gateway-time-out-error-with-almost-zero-load-on-a-test-se) - Linus Kleen
2
简而言之,如果机器A需要通过端口9000连接到B,但该端口被阻止,则它会建立一个常规的SSH会话,并指示SSH客户端(在机器A上)本地设置一个端口9000。然后,对此本地端口的连接将通过SSH隧道传输到目标机器B。评论字段中没有太多空间了;如果您需要更多详细信息,请提出问题。 - Linus Kleen
显示剩余8条评论

25

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_autostart 已被 xdebug.mode=debugxdebug.start_with_request=yes 替换
  • xdebug.remote_host 已被 xdebug.client_host 替换
  • xdebug.remote_port 已被 xdebug.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以保留旧的默认端口

非常正确的答案;谢谢... 在我的情况下,我有Win 10和Php7.3.13、Netbeans 8.2和IIS 10(浏览器是带有Netbeans扩展的Chrome和FF)... 然后我安装了xdebug(使用向导)并进行了以下配置: - Saurabh
只想补充一下,使用 Xdebug 3 时,我们应该使用 xdebug.discover_client_host=1 而不是 xdebug.remote_connect_back - Sannek8552
@Brad,我正在使用PHP5.6和XDebug2.5.5,请问我的情况下应该如何配置。您能否请看一下https://dev59.com/JK32oIgBc1ULPQZFjQ3S? - Gireesh
谢谢,我在升级之前的wamp初始设置中混合了旧的和新的方法,使用您上面的配置(减去idkey)后,完美地解决了问题! - Liam Wheldon

24

对我来说,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访问。

2
我相信这被称为SSH隧道,而不是端口转发,尽管它有点类似。我认为,“端口转发”通常是指公共路由器配置在根据流量所需的端口将流量发送到其私有网络内的某些机器上。我用它来设置了我的家用机器上的Web服务器。端口80(http)的流量会自动发送到该机器(而不是我的室友的机器)。 - Buttle Butkus
1
太好了,这个可行,你能解释一下是怎么回事吗?因为我之前用过类似的ssh命令来建立代理到服务器,但那个解决方案没用。 - santiago arizti

20

关键指令是:

xdebug.remote_connect_back = On

这样可以让Web服务器连接到请求调试会话的任何计算机。这样,您就不必硬编码IP地址,可以共享Xdebug。此指令在早期版本中不存在,并经常在教程和文档中被省略。

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


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

8
在我的情况下,这些命令帮助了我:
xdebug.remote_enable = On
xdebug.remote_autostart=1

注意:由于 'xdebug.remote_autostart=1' 的存在,调试器即使没有GET/POST/COOKIE变量也会起作用。


7

在尝试配置docker时,我遇到了几次相同的问题。在多次思考后,我意识到以下方法可以解决这个问题。因此,我将其作为答案记录在此,以便今后查看。

大多数情况下,Dockerfile会将以下语句添加到php.ini文件中:

xdebug.remote_connect_back     = on

这会导致所有事情似乎都很正常,但是PHP Storm实际上没有捕获任何调试连接。将上面的行替换为以下内容立即为我解决了问题。
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,我一直以为是因为我有点诵读障碍)

2
那个 host.docker.internal 的部分...我现在可以亲你一口了。 - Chris Anderson
1
那只适用于Mac或Windows,但不适用于主要使用的Linux...我简直不敢相信这种事情...这让我很生气... - matiaslauriti
我尝试了我认为是 host.docker.internal 的 IP(172.17.0.1),但它没有起作用;不过主机名确实可以!谢谢! - Charlie
@JulesColle,还是不行,那是你为该Docker分配的IP地址...如果我必须与团队共享它,他们将不得不输入自己的IP地址...这是不可接受的... - matiaslauriti
我没有使用任何Docker或PHPStorm。你能帮我解决这个问题吗? https://dev59.com/JK32oIgBc1ULPQZFjQ3S - Gireesh
显示剩余2条评论

3
如果您正在使用 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设置


3
感谢在服务器端的php.ini文件中设置了xdebug.remote_connect_back = On。 此外,我还需要使用Chrome浏览器的这个插件才能在PhpStorm中启动调试会话。

3

您需要设置:

xdebug.remote_host=192.168.1.104

192.168.1.104 是客户端的IP地址,在你使用IDE时会用到。


谢谢。然而,我认为当您想要连接到Xdebug远程服务器的多个IP时,这种方法不起作用。请参见Linus Kleen上面的评论。 - Gruber

1
你要启动哪个页面扩展名来开始调试?我记得我曾经疯狂地度过了无眠的夜晚,所有与XDebug有关的设置都很好。问题是我没有以.PHP而是以.HTML开头。
如果是这样,请尝试使用.PHP文件来启动调试。

1
我有一个.PHTML文件作为启动文件。至少从它的图标来看,NetBeans将其识别为PHP文件。我尝试将其更改为.PHP,但没有成功。还是谢谢你的提示! - Gruber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接