【问题标题】:Xdebug unable to connect to client, where do I start debugging the debugger?Xdebug 无法连接到客户端,我从哪里开始调试调试器?
【发布时间】:2016-12-25 22:40:06
【问题描述】:

我正在 sublime 文本中为 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 直接进行调试可能会有所帮助,但它只是显示谷歌浏览器错误页面:“本地主机拒绝连接”。也许另一端存在错误,无法将数据推送到 sublime text 客户端,我不知道。当我运行测试/等时,Sublime text xdebug 确实显示消息“Reloading /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 设置:

【问题讨论】:

  • 可能不重要,但请尝试在 remote_host 属性中的 localhost 之前添加 http://
  • @Glubus 错误消息更改为:日志于 2016-08-22 13:40:28 打开 I:连接到配置的地址/端口:localhost:9988。 E: 无法连接到客户端。 :-( 日志于 2016-08-22 13:40:28 关闭,否则没有区别。
  • 你有防火墙会阻止那个端口吗?
  • 运行telnet localhost 9988时会发生什么?
  • @axiac 当我远程登录到该端口时连接被拒绝。当我连接到 localhost 端口 80 时,它确实连接(如我所料)我会说应用程序的服务器没有运行,但我不知道 xdebug 的服务器是什么,也不知道它如何指定一个开放端口。 telnet localhost 9988 Trying 127.0.0.1... telnet:无法连接到远程主机:连接被拒绝 $ telnet localhost 80 Trying 127.0.0.1... 连接到本地主机。转义字符是'^]'。 MikeSimonson:防火墙设置为允许该端口的传入和传出。

标签: php sublimetext3 xdebug sublime-text-plugin


【解决方案1】:

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

然而,尽管客户端连接到服务器的通常的客户端-服务器协议,PHP 调试器的工作方式相反:服务器是连接到客户端的那个(应该启动并侦听端口 @987654325 @)。

xdebug 是最知名的 PHP 调试扩展。有许多程序和程序扩展/插件充当它的客户端。我没有使用 Sublime 的 Xdebug 包(首先我没有使用 Sublime),但原理是一样的。

调试会话如何工作?

客户端软件(在您的情况下带有 Xdebug 包的 Sublime)开始侦听 localhost 的端口 9000,等待服务器启动连接。它可能不会一直监听端口,但只有在开发人员告诉它时才会监听。

您启动 PHP 脚本进行调试。 xdebug 不会启动对服务器的所有请求,但只有在它在请求中找到标记时才会启动。根据用于运行脚本的 SAPI,标记是环境变量(用于 CLI 脚本)或 cookie 或 GETPOST 参数(用于网页)。阅读文档的"Starting The Debugger" 部分的更多信息。

当 PHP 解释器开始执行 PHP 脚本时,如果 xdebug 找到上面解释的标记,那么它会尝试连接 xdebug 客户端。否则,它会不碍事,让脚本全速运行。

当环境中存在调试标记时,xdebug 扩展(服务器)会尝试连接到xdebug 客户端(默认情况下在localhost 的端口9000 上,但这些设置可以更改为需要)。如果它无法连接(因为客户端没有在监听),那么它会记录失败,然后将自己置于一边,让脚本全速运行。

在成功连接到客户端后,xdebug PHP 扩展要么在运行 PHP 脚本的第一条语句之前停止,要么运行脚本直到其执行到达断点。在建立连接的初始通信期间,客户端将这种行为和断点列表发送到服务器。然后扩展等待来自客户端的命令。客户端向开发人员显示正在运行的脚本的当前状态(下一条要运行的语句、当前范围内的变量值等)并等待命令(运行下一条语句、继续、添加/删除断点、观察一些变量等)。

为什么它不适合你?

您的问题对我来说不是很清楚,但我假设您在运行 xdebug 客户端 (localhost) 的同一台计算机上运行网络服务器(使用 PHP 解释器和 xdebug 扩展名)。如果不是这种情况,请不要绝望。解决方案是一个命令行(在答案末尾阅读)。

从您在问题中发布的信息可以清楚地看出,xdebug 已安装、启用并且可以正常工作。 telnet localhost 9988 的输出表明没有人正在监听端口 9988xdebug 客户端应该在那里监听。

我从未使用过 Sublime Text(及其软件包)。 This article 解释了如何安装并使其工作。但是,它没有解释如何将其配置为侦听端口9988

我将首先设置 PHP xdebug 扩展以连接到默认端口 (9000):

xdebug.remote_port=9000

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

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

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

在这种情况下调试 PHP 脚本的最简单方法如果你有ssh 访问远程机器是从远程机器的端口9000 创建一个ssh 隧道到本机端口9000

假设您使用ssh 连接到远程计算机(将文件放在上面),您所要做的就是将-R 9000:localhost:9000 附加到用于连接和启动ssh 会话的命令行到远程机器。

只要这个连接打开,远程机器(-R)的端口9000(上面命令行的第一个9000)上的任何连接请求都会通过隧道转发到端口@987654368本地计算机 (localhost) 的 @(命令行中的第二个 9000)。这样远程xdebug PHP 扩展就可以联系远程xdebug 客户端(假设它正在监听)。

【讨论】:

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

好的,经过对不同设置的广泛测试,以下是我为追随我的人调试问题的建议:

  1. 不要依赖仅使用 1 个 xdebug 客户端进行测试!安装两个编辑器/IDE 很简单,因此请运行一个备用编辑器,以便查看 xdebug 或特定客户端是否存在问题!

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

【讨论】:

    【解决方案3】:

    如果您使用的是xdebug-v3,请尝试:

    xdebug.mode=debug
    xdebug.start_with_request=yes
    xdebug.discover_client_host=1
    

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

    【讨论】:

      猜你喜欢
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      • 2021-06-24
      • 2013-06-06
      • 1970-01-01
      • 2021-03-17
      相关资源
      最近更新 更多