Xdebug无法连接到客户端,我应该从哪里开始调试调试器?

13

我正在为Sublime Text设置PHP的xdebug,但xdebug一直记录与无法连接相关的错误:

Log opened at 2016-08-18 21:06:01
I: Connecting to configured address/port: localhost:9988.
E: Could not connect to client. :-(
Log closed at 2016-08-18 21:06:01

我希望通过直接在浏览器中访问http://localhost:9988进行调试可能会有所帮助,但它只显示谷歌Chrome错误页面:"localhost拒绝连接"。也许错误存在于另一端,无法将数据推送到sublime text客户端,我不知道。当我运行测试/等时,Sublime Text xdebug确实显示消息“重新加载/var/log/xdebug/xdebug.log”,因此似乎已经意识到正在运行的PHP代码,只是没有进一步操作。

所以,我从未想过要调试xdebug本身,但是:我该如何调试xdebug与代码编辑器之间的连接?如果这是nginx,我会开始调试虚拟主机,但由于它是xdebug......我不知道从哪里开始调试缺少应用程序的问题?

##各种配置设置##

我使用的是ubuntu linux 14.04。

以下是我的xdebug.ini配置文件(如果相关):

[xdebug]
xdebug.default_enable=1
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_host="localhost"
xdebug.remote_handler="dbgp"
xdebug.remote_port=9988
xdebug.remote_mode = req
xdebug.overload_var_dump=0
xdebug.idekey = sublime.xdebug
xdebug.remote_log="/var/log/xdebug/xdebug.log"
;https://github.com/martomo/SublimeTextXdebug

Xdebug已安装:

apt-cache policy php-xdebug
php-xdebug:
  Installed: 2.4.0-5+donate.sury.org~trusty+1
  Candidate: 2.4.0-5+donate.sury.org~trusty+1
  Version table:
 *** 2.4.0-5+donate.sury.org~trusty+1 0
        500 http://ppa.launchpad.net/ondrej/php/ubuntu/ trusty/main amd64 Packages
        100 /var/lib/dpkg/status

模块已激活:

php -m | grep -i xdebug
xdebug
Xdebug

phpinfo xdebug设置:

通过phpinfo查看xdebug设置


可能不太重要,但是尝试在remote_host属性中加入http://前缀,然后再连接localhost。 - Glubus
@Glubus 错误信息已更改为:日志打开于2016-08-22 13:40:28 正在连接到配置的地址/端口:http://localhost:9988。 无法连接到客户端。 :-( 日志关闭于2016-08-22 13:40:28除此之外没有任何区别。 - Kzqai
你有防火墙会阻止该端口吗? - Mike Simonson
当您运行 telnet localhost 9988 时会发生什么? - axiac
当我telnet到那个端口时,连接被拒绝。当我连接到本地主机的80端口时,它可以连接(正如我所期望的)。我想应用程序的服务器没有运行,但我不知道xdebug的服务器是什么,也不知道它如何指定一个开放的端口。 telnet localhost 9988 尝试127.0.0.1... telnet:无法连接到远程主机:连接被拒绝 $ telnet localhost 80 尝试127.0.0.1... 已连接到localhost。 转义字符为'^]'。MikeSimonson:防火墙设置为该端口的入站和出站都是允许的。 - Kzqai
类似问题:http://stackoverflow.com/questions/24520753/how-to-use-xdebug-with-sublime-to-debug-python-script - Kzqai
3个回答

21

PHP调试需要两个组件共同协作:一个充当服务器的PHP扩展和一个知道如何与该扩展进行通信并驱动其功能的软件(它是客户端)。

然而,尽管通常的客户端-服务器协议是客户端连接到服务器,但PHP调试器的工作方式恰恰相反:服务器是连接到客户端的那个(客户端应该已经启动并在端口9000上监听)。

xdebug是最常用的PHP调试扩展。有许多程序和程序扩展/插件可以充当其客户端。我没有使用过Sublime的Xdebug包(事实上我从未使用Sublime),但原理都是一样的。

调试会话的工作原理是什么?

客户端软件(在您的情况下为Sublime与Xdebug包)开始侦听localhost9000端口,等待服务器启动连接。但它可能只在开发人员告知它侦听端口时才侦听该端口。

您启动要调试的PHP脚本。xdebug不会在所有请求服务器时触发,而只会在请求中找到标记时才会触发。根据用于运行脚本的SAPI,标记可以是环境变量(适用于CLI脚本)或Cookie或GETPOST参数(适用于Web页面)。在文档的"Starting The Debugger"一节中了解更多信息。

当PHP解释器开始执行PHP脚本时,如果xdebug找到上述标记,则尝试连接xdebug客户端。否则,它将保持不动并让脚本以其全速运行。

当环境中存在调试标记时,xdebug扩展(服务器)会尝试连接到xdebug客户端(默认情况下在localhost9000端口上,但这些设置可以根据需要更改)。如果无法连接(因为客户端未侦听),则记录失败并使自己保持不动,然后让脚本以其全速运行。

成功连接到客户端后,xdebug PHP扩展要么在运行PHP脚本的第一个语句之前停止,要么运行脚本,直到其执行达到断点。该行为和断点列表随着他们建立连接时由客户端发送到服务器。然后该扩展等待客户端的命令。客户端向开发人员显示正在运行的脚本的当前状态(下一条要运行的语句,当前范围内变量的值等),并等待命令(运行下一个语句,继续,添加/删除断点,查看某些变量等)。

为什么它对您不起作用?

从您在问题中发布的信息来看,很明显xdebug已安装、启用且正常工作。输出telnet localhost 9988说没有人在9988端口上听。xdebug客户端应在那里侦听。

我从未使用过Sublime Text(及其包)。xdebug.remote_port=9000

然后,如果一切正常,我会尝试找出如何配置Sublime Text的 xdebug 包以监听不同的端口。您真的需要它在不同的端口上监听吗?

如果Web服务器和xdebug客户端在不同的计算机上怎么办?

如果您需要调试在远程计算机上运行的PHP脚本,则 xdebug 客户端侦听本地计算机(端口号为 9000),并且 xdebug 扩展尝试连接到远程计算机上的端口号 9000。在局域网和VPN中可行的解决方案是将 xdebug 配置为连接到本地计算机的端口号 9000,但除了这些条件外,通常还需要更改防火墙和/或其他安全软件。

在此情况下调试PHP脚���的最简单方法如果您有远程计算机的 ssh 访问权限是从远程计算机的端口号 9000 到本地计算机的端口号 9000创建一个 ssh 隧道。

假设您使用 ssh 连接到远程计算机(将文件放在其上),您需要做的就是在用于连接并启动与远程计算机的 ssh 会话的命令行中添加 -R 9000:localhost:9000

只要此连接处于打开状态,远程计算机上端口号为 9000 的任何连接请求(上面命令行中的第一个9000)都将通过隧道转发到本地计算机 (命令行中的第二个9000)的端口号 9000(使用 localhost)。这样,远程的 xdebug PHP扩展程序便能够联系远程的 xdebug 客户端(假设它正在监听)。


我将所有东西都移回了9000端口,但它仍然不允许我连接到该端口。 telnet localhost 9000 尝试127.0.0.1... telnet:无法连接到远程主机:连接被拒绝 - Kzqai
我现在非常仔细地重新阅读了您的问题,有一些不清楚的地方:您是否在Sublime Text中安装了Xdebug客户端插件?Sublime Text需要它才能调试PHP脚本。如果已经安装,则打开Sublime Text并使用“工具-> Xdebug”菜单中的“开始调试”命令。 Xdebug客户端将在Sublime Text中打开四个选项卡。打开控制台并运行telnet localhost 9000命令,应该可以运行。 - axiac
是的,我肯定安装了Xdebug客户端插件(因为你提到的选项都可用)。在查找了这个错误报告之后:https://github.com/martomo/SublimeTextXdebug/issues/160,并最终收到一些“Xdebug客户端已崩溃”的错误消息(之前根本没有出现过,可能是针对9000端口进行硬编码或其他原因?谁知道呢),我认为当使用Sublime Text 3而不是Sublime Text 2时,xdebug客户端会崩溃。我将把我的发现和建议作为单独的答案报告给其他人,并向您授予奖励。 - Kzqai
无论出于何种原因,从telnet localhost 9000始终没有得到任何响应,除了“连接被拒绝”的提示。尽管在xdebug客户端未崩溃的情况下获得了一些有限的功能。 - Kzqai
我在Linux Mint 17上使用Sublime Text 3尝试了SublimeText插件,它对我来说运行良好。几天前,我还在OSX上尝试了一下Sublime Text 2。我的测试中没有涉及Chrome(我看到你提到的某个bug中有关于Chrome插件的参考)。 - axiac

2
如果您正在使用 xdebug-v3,请尝试以下操作:
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.discover_client_host=1

这应该可以解决您的问题。

我不知道为什么……它有效。 - Khay Leng

1

好的,经过各种不同设置的广泛测试,这是我为那些在我之后遇到问题的人提供的调试建议:

  1. 不要仅依赖于使用一个xdebug客户端进行测试!安装两个编辑器/IDE非常容易,因此运行 备用编辑器 可以看到是否存在xdebug或特定客户端的问题!

  2. 可能有3个位置包含xdebug + xdebug客户端组合的配置!客户端(或编辑器插件)配置、20-xdebug-conf.ini文件(或php.ini等效文件)和项目特定配置。确保所有3个位置在端口、路径映射等方面保持同步。


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