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

Xdebug unable to connect to client, where do I start debugging the debugger?

我正在 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 进行调试可能会有所帮助,但它只显示 google chrome 错误页面:"localhost refused to connect"。也许错误存在于另一端,无法将数据推送到 sublime text 客户端,我不知道。当我 运行 tests/etc 时,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

php信息 xdebug 设置:

PHP 调试需要两个协作的组件:一个作为服务器的 PHP 扩展和一个知道如何与该扩展对话并驱动其功能的软件(它是客户端)。

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

xdebug 是最著名的 PHP 调试扩展。有许多程序和程序 extensions/plugins 作为它的客户端。我没有使用 Sublime 的 Xdebug 包(首先我没有使用 Sublime)但是原理是一样的。

调试会话如何工作?

客户端软件(在你的例子中是带有Xdebug包的Sublime)开始监听localhost的端口9000,等待服务器开始连接。它可能不会一直在端口上监听,只有在开发人员告诉它时才监听。

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

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

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

成功连接到客户端后,xdebug PHP 扩展要么在 运行 执行 PHP 脚本的第一条语句之前停止,要么 运行s 脚本,直到它的执行到达断点。此行为和断点列表由客户端在建立连接时的初始通信期间发送到服务器。然后扩展等待来自客户端的命令。客户端向开发人员显示 运行ning 脚本的当前状态([=120= 的下一条语句]、当前作用域中变量的值等)并等待命令(运行下一条语句,继续,add/remove 断点,观察一些变量等)。

为什么它对你不起作用?

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

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

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

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

xdebug.remote_port=9000

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

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

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

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

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

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

好的,在对不同设置进行了大量测试之后,以下是我为后来者调试问题的建议:

  1. 不要依赖仅使用 1 个 xdebug 客户端进行测试!安装两个 editors/IDEs 是微不足道的,所以得到一个 备用编辑器 运行 可以查看 xdebug 或特定客户端是否有问题!

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

如果您正在使用xdebug-v3,请尝试:

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

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