开发者测试调试工具Xdebug安装及集成使用教程

开发者测试调试工具Xdebug安装及集成使用教程

正如任何一个开发者可以证明的那样,代码在初稿之后永远不可能为生产做好准备。开发过程中的一个关键部分是调试–删除或改变代码中所有不工作的部分。

PHP的Xdebug扩展是一种流行的方法,可以根除并摧毁你代码中的所有bug。

Xdebug的一个伟大方面是它的灵活性。无论你喜欢哪种框架或开发环境,你都能找到适合你工作流程的Xdebug版本。从这里开始,掌握这个工具不会花很长时间。

本教程将深入研究Xdebug,包括安装过程、将其集成到你的设置中,以及一般使用方法。

首先,让我们给你更多关于Xdebug是什么和它做什么的背景。

  1. Xdebug介绍
  2. 为什么要使用Xdebug?
  3. 如何开启PHP错误日志
  4. 如何使用Xdebug
  5. 结合PhpStorm使用Xdebug
  6. 命令小贴士

Xdebug介绍

Xdebug是最流行的调试PHP代码的扩展之一。你将在你选择的环境中安装它,它充当一个 “步骤调试器”。

Xdebug的核心是步进式调试器,它与集成开发环境紧密结合,可以非常简单地在PHP代码中设置断点,以深入了解代码在运行时的情况。

Xdebug是一个PHP扩展,必须和PHP一起安装和编译。幸运的是,很多本地开发工具使安装和运行Xdebug变得简单。

xdebug

Xdebug logo

简而言之,这使你能够逐行处理你的代码,这样你就可以逐步查看代码在你的程序中是如何行动和互动的,以及调查其输出。从那里,你可以根据你的需要进行修改。

不过,Xdebug可以做得更多。

  • 你可以使用一套指标和可视化的方法来分析你的代码的性能。
  • 当你运行PHP单元测试时,你可以看到你运行和执行的代码套件。
  • Xdebug包括 “跟踪 “功能,它将把每个函数的调用写到磁盘上。这将包括参数、变量赋值和返回值。
  • Xdebug还对标准的PHP错误报告做了改进。我们将在后面介绍更多这方面的内容。

鉴于这些特性,有很多方法可以在你的工作流程中使用Xdebug(以及任何类似的调试器)。我们将在下一节中介绍这些。

为什么要使用Xdebug?

许多开发者不会有一个专门的调试工作流程,使用第三方工具和扩展。这是因为 PHP 包含了它自己的基本错误记录。你会使用as error_logvar_dumpprint等命令来查看变量和函数调用的结果。

例如,有很多片段你可以重新用于WordPress的开发–Stack Overflow上有很多这样的片段

function log_me($message) {
if ( WP_DEBUG === true ) {
if ( is_array($message) || is_object($message) ) {
error_log( print_r($message, true) );
} else {
error_log( $message );
}
}
}

然而,这种方法也有一些重要的缺点。

  • 你首先必须确保你为你所使用的平台启用错误日志。在这种情况下,你要启用 WP_DEBUG (稍后会有更多介绍)。
  • 这个 “转储 “调试的例子比步骤调试提供的调查范围要小。在这里,你只能输出你定义的东西。

后一点需要很多手工操作,尤其是当你的日常工作不是系统管理员的时候。例如,如果你想调试一个代码块,你可能会根据你定义的一个变量来添加你的代码段。然而,它可能不是问题的根源,甚至不能说明正在发生什么。

相反,像Xdebug这样的工具可以发挥其魔力,提供更大的范围。

  • 你可以在执行过程中的不同点 “破坏 “你的代码,以查看实时发生的情况。
  • 有无数的指标、可视化、分支等等来帮助你确定你的代码在做什么以及它是如何反应的。
  • 有时,你甚至可以在调试过程中即时改变数值。这提供了巨大的价值,甚至对于工作良好的代码套件也是如此。你基本上可以在任何时候进行手动单元测试。
  • 因为你使用断点来标记要调试的区域,所以你不需要在你的代码中使用片段工作。这可以使你的代码更干净,并减少未来问题的数量。

总的来说,使用像Xdebug这样的工具是一个主动的决定,而不是一个被动的决定。你可以把步骤调试作为核心开发过程的一部分,就像实施单元测试作为测试驱动开发(TDD)的一部分。

如何开启PHP错误日志

虽然你可以在没有具体错误的情况下调试你的代码,但在没有打开Xdebug的情况下知道问题是否发生往往是很好的。这给你一个探索的起点。这不是严格意义上的必要条件,但可以成为你的链条中的一个有用部分。

要报告每一个出现的错误,你需要在相关的PHP文件的顶部添加一行。

error_reporting(E_ALL);

这是一个包罗万象的命令,你可以用ini_set函数实现同样的目的。

ini_set('error_reporting', E_ALL);

这让你可以逐个项目地改变php.ini文件中的设置。虽然你可以进入这个文件并进行手动更改,但通常使用 ini_set 来更改特定的参数是一个更好的主意:

ini_set('display_errors', '1');

一旦你把主动错误报告设置成你喜欢的样子,你就可以开始用Xdebug工作。

如何使用Xdebug

在接下来的几个部分,我们将向你展示如何使用Xdebug,包括你需要设置的步骤。虽然我们不能涵盖每个工具的各个方面,但这个快速入门指南会让你快速入门。

不过,首先,你需要安装Xdebug。让我们来看看如何做到这一点。

1. 为你的操作系统(OS)安装Xdebug

因为Xdebug可以适应任何数量的设置,所以每个设置的具体过程都会略有不同。在操作系统层面上,有一些区别。

  • Windows:这是一个有点复杂的设置过程,包括使用现有的 PHP 文件和安装向导,然后下载适合你的系统的版本。
  • Linux:这里的方法可以说是最直接的了。你可以使用包管理器来安装Xdebug,或者PHP扩展社区库(PECL)
  • Mac:这个方法也很简单。一旦你安装了PECL,你可以在终端实例中运行 pecl install xdebug 。你还需要在你的系统上安装XCode命令行工具和PHP。

然而,大多数用户不会想坚持使用系统级的Xdebug实例。相反,你会想把它整合到你自己的开发环境中。

2. 将Xdebug集成到你的开发环境中

一旦你为你的操作系统安装了Xdebug,你应该把它连接到你的环境中。

这里有很多支持的系统和工具,我们无法一一介绍。稍后,我们将为你提供PhpStorm的说明。即便如此,还有很多其他流行的环境可以选择。下面是我们的一些顶级推荐。

Variing Vagrant Vagrants(VVV)

VVV是Make WordPress网站上的命名环境之一。

Varying Vagrant Vagrants标志

Varying Vagrant Vagrants标志

好消息是,VVV已经包括了Xdebug的一个版本,但你需要激活它。你可以在一个终端窗口中使用安全壳(SSH)来完成这个任务。

vagrant ssh -c "switch_php_debugmod xdebug"

不过,这对性能有一点影响,如果你提供你的网站,你将需要把这个选项重新打开。

Laravel Valet

对于一些用户来说, Laravel的Valet代表了一个近乎完美的网络开发环境. 更棒的是, 你可以将Xdebug与之整合.

要做到这一点, 你需要为调试器创建一个配置文件. 你可以在命令行中使用 php --ini 找到你自己的路径, 这将返回一些不同的文件路径:

终端机显示配置文件的路径列表

终端机显示配置文件的路径列表

接下来,在其他.ini文件的路径上创建一个新的xdebug.ini文件。在我们的例子中,它位于/opt/homebrew/etc/php/7.4/conf.d

一旦你打开这个新文件,也要打开加载的配置文件(你的主php.ini文件)的路径。两者都打开后,在底部添加以下内容。

  • php.ini: zend_extension="xdebug.so"
  • xdebug.ini: xdebug.mode=debug

一旦你保存了你的改动,从终端运行 valet restart ,然后在你的网站的一个文件中加入 phpinfo(); exit; 。你想通过在浏览器中快速加载页面来检查这是否有效。

PHP信息界面

PHP信息界面

注意你可能需要用 sudo brew services restart php 来重启PHP,同时用 php --info | grep xdebug来检查你的系统安装Xdebug是否正确。你会注意到输出中的Xdebug专用行:

检查你的系统安装Xdebug是否正确

从这里,你可以寻求将Xdebug纳入你选择的编码编辑器中。

XAMPP

与Valet一样,XAMPP的过程也有几个部分。然而,Windows和macOS版本有两个不同的过程。

首先安装XAMPP,然后快速检查你的系统中是否存在php_xdebug.dll文件(Windows)或xdebug.so文件(macOS)。

显示XAMPP文件测试的终端窗口

显示XAMPP文件测试的终端窗口

如果该文件存在,就可以继续配置了。否则,首先需要下载适合Windows的二进制文件–为你喜欢的PHP版本下载一个64位的文件–或者如果你用的是Mac,则需要安装更多的依赖项。

对于 Windows,重命名 DLL 文件 php_xdebug.dll,然后把它移到 \xampp\php\ext 文件路径中。接下来,在你喜欢的代码编辑器中打开\xampp\php\php.ini文件并添加以下内容:

output_buffering = Off

在 [XDebug] 部分,添加以下三行。

zend_extension=xdebug
xdebug.mode=debug
xdebug.start_with_request=trigger

一旦你保存了你的更改,重新启动Apache并测试Xdebug。

对于Mac,你要确保你在终端实例中使用 xcode-select --install 来安装Xcode命令行工具。之后,有三个软件包你要用Homebrew来安装。

brew install autoconf automake libtool

在某些情况下,你还需要重新安装XAMPP以获得核心程序和 “开发者文件”。你应该可以只重新安装这些文件,但你要先对你现有的设置进行备份。

接下来,在你的系统上导航到Xdebug源文件夹的下载,解压TGZ文件。在一个终端窗口中,导航到该目录并运行以下程序:

phpize
pecl install xdebug

注意,你可能也需要在这里使用 sudo 。从这里,你可以编辑XAMPP的php.ini文件。对于大多数macOS安装,你可以在/Applications/XAMPP/xamppfiles/etc/php.ini中找到它。在这个目录中,你也会找到你的xdebug.so文件的路径–记下它并使用它来代替本片段中的文件路径占位符。

[xdebug]
zend_extension=/path/to/xdebug.so
xdebug.mode=develop,degug
xdebug.start_with_request=yes

为了测试这是否有效,在htdocs XAMPP主目录下创建一个新的xdebug_info.php文件。在里面,添加以下内容:

<?php
xdebug_info();

…然后刷新Apache并在浏览器中测试Xdebug。

结合PhpStorm使用Xdebug

一旦你通过操作系统和你的开发环境安装了Xdebug,你还需要查看调试器本身。你将通过你选择的代码编辑器或集成开发环境(IDE)来做这件事。就像你的环境一样,有很多可供选择的,每一个都可能有不同的方法。

这就是说,许多开发人员选择使用JetBrains的PhpStorm。事实上,PhpStorm提供了 “感知WordPress的协助“–而且它也是一个受欢迎的选择,因为有许多其他原因。

PhpStorm界面

PhpStorm界面

JetBrains 网站包括连接 Xdebug 和 PhpStorm 的完整说明,但我们将在此回顾一下。

首先,在Preferences窗格中导航到Languages & Frameworks > PHP页面。在这里,打开CLI Interpreter下拉字段旁边的More Items串菜单:

CLI解释器

在PhpStorm中选择一个CLI解释器

这将显示一些关于你的 PHP 版本和解释器的进一步细节。如果你点击Configuration file选项旁边的More items省略号,你会看到php.ini文件的完整路径。

在PhpStorm中修改PHP配置

在PhpStorm中修改PHP配置

接下来你将使用这个PHP文件来继续设置过程

在php.ini文件中工作

这里的第一个任务是编辑出任何影响 Xdebug 如何与 PhpStorm 一起工作的行。

php.ini 文件中,寻找以下几行,并将其删除或注释掉。

zend_extension=<path_to_zend_debugger>
zend_extension=<path_to_zend_optimizer>

这些行不会在所有情况下出现,所以如果你没有看到它们,不要惊慌。

接下来,在文件中添加以下内容。

[xdebug]
zend_extension="xdebug.so"
xdebug.mode=debug
xdebug.client_host=127.0.0.1
xdebug.client_port="<the port (9003 by default) to which Xdebug connects>"

关于这套代码,有几件事需要注意。

  • 你可能已经有一个[xdebug] 部分,在这种情况下你可以省略第一个指定。
  •  zend_extension 条目可能需要你添加xdebug.so的完整路径来连接。
  • 虽然它可能看起来像一个占位符,但 xdebug.client_port 参数是你在代码内的设置方式。

一旦你添加了这些,保存并关闭文件,然后从命令行测试PHP版本(使用 php --version)。

使用macOS终端测试PHP和Xdebug的当前安装

使用macOS终端测试PHP和Xdebug的当前安装

如果你有一个工作版本的Xdebug,它将显示为PHP扩展之一。你也可以将 phpinfo(); 添加到一个新文件中,并在浏览器中进行测试。

这就是让Xdebug作为PhpStorm的默认调试器所需要做的一切。使用它之前的最后一步是安装一个浏览器辅助扩展。

安装一个浏览器辅助扩展

你需要在你的浏览器和 PhpStorm 之间建立的最后一个关键连接,是通过激活服务器上的步骤调试来完成的。虽然你可以在命令行中使用特殊的 GET 或 POST 值来做这件事,但使用一个扩展是更直接的。

我们推荐使用专用的Xdebug Helper扩展。你可以在你选择的浏览器上安装它:

如果你想探索其他扩展,JetBrains网站为最流行的浏览器提供了一些额外的选择。

一旦你安装了你选择的浏览器扩展,你不应该再调整任何进一步的配置设置。从这里,你可以开始使用PhpStorm的Xdebug。

使用Xdebug

虽然我们在这里使用PhpStorm,但你会看到不同IDE之间有类似的布局和界面–尽管也会有一些明显的区别。

有几个概念结合起来形成了整个调试体验。

  • 断点。这些点是Xdebug会停下来让你检查输出的地方。你可以根据自己的需要设置任意多的断点。
  • 监听连接。你可以打开或关闭这个功能,尽管大多数开发者总是把它打开。
  • 调试屏幕。你的大部分时间将在调试界面中度过–你将在这里处理各种代码行、变量和参数。

第一步是激活监听–没有监听,你就无法调试任何东西。要做到这一点,请点击工具栏上的Run > Start Listening for PHP Debug Connections选项。

在PhpStorm中打开的运行菜单

在PhpStorm中打开的运行菜单

作为一种选择,你可以点击PhpStorm工具栏中的 “telephone”图标:

使用PhpStorm工具条内的电话图标监听PHP调试连接

使用PhpStorm工具条内的电话图标监听PHP调试连接

这两个选项中的任何一个都会开始监听连接。

从这里,你可以开始在代码编辑器的沟槽中设置断点。一个红点表示一个断点,你可以点击它来激活:

在PhpStorm编辑页面的沟槽内设置断点

在PhpStorm编辑页面的沟槽内设置断点

当你想调试你的代码时,最直接的方法是开始监听,设置断点,然后前往浏览器中的特定页面。在浏览器中找到你的扩展图标,然后点击它,选择 “Debug”选项:

选择debug浏览器

在浏览器工具栏内选择调试选项,使用一个专门的扩展

这将在PhpStorm中打开调试器并提供好消息或坏消息:

使用PhpStorm调试器与Xdebug

使用PhpStorm调试器与Xdebug

如果你右键单击各种值、属性、参数和变量,你将能够访问一个进一步的上下文菜单。这为你提供了大量的额外空间来测试和调试你的代码:

在PhpStorm调试器中使用右键上下文菜单来设置新值

在PhpStorm调试器中使用右键上下文菜单来设置新值

例如,你可以沿着路径为变量设置不同的值。这可能是故意要破坏你的代码,看看会发生什么,也可能是测试已经需要修复的代码的一种方式。无论哪种方式,这都为你提供了一个极好的方法来调试你的代码,而不需要先改变它。

命令小贴士

在我们结束这篇文章之前,我们应该提到快捷键。

像许多其他软件一样,有各种方法可以仅使用键盘在Xdebug(和PhpStorm)中导航。事实上,你甚至可以使用命令行来调试PHP脚本。

一旦Xdebug启动并运行,你可以使用以下命令来进行操作:

命令 快捷方式
指定要监听的端口(如 [9003] -p [value]
Sets a breakpoint on the specified line for the file path given. breakpoint_set -t line file:///<path> -n <line>
在给定文件路径的指定行上设置一个断点 run
步入下一个可执行行 step_into
列出当前范围内的变量和值 context_get
显示指定属性的值 property_get -n <property>

虽然您的特定代码编辑器将有自己的专用快捷方式,但这里的重点是PhpStorm。请看下面的键盘快捷键表,了解如何将Xdebug与PhpStorm配合使用:

命令 Windows macOS
查找动作 Ctrl + Shift + A Shift + Cmd + A
打开调试器 Shift + F9 Ctrl + D
切换断点 Control + F8 Cmd + F8
进入 F7 F7
跨越 F8 F8
查看断点 Ctrl + Shift + F8 Shift + Cmd + F8
恢复程序 F9 F9
评估当前表达式 Alt + F8 Option + F8

评估当前表达式庆幸的是,这里没有太多需要记忆的东西。你必须打开调试器,设置每行的断点,监听连接,并运行你的脚本。

然而,如果你需要一个特定任务的快捷方式,你可以使用PhpStorm查找动作命令。

在PhpStorm中使用查找动作菜单

在PhpStorm中使用查找动作菜单

一旦你开始在这个空间里打字,你就会看到一个动态的命令和相关的快捷键列表。你还可以通过Help > Keyboard Shortcuts PDF菜单找到所有键盘快捷键的PDF版本。

如果你想在使用鼠标工作时更多地实时查看快捷方式,JetBrains提供了Key Promoter X插件。

PhpStorm界面显示Key Promoter X的通知

PhpStorm界面显示Key Promoter X的通知

这个方便的工具将显示你最近执行的动作的通知,以及其相关的键盘快捷键。一旦你学会并使用了这些快捷键,你就可以逐步淘汰这个插件,恢复你屏幕上的宝贵空间。

小结

调试的实践已经从它卑微的开始走过了漫长的道路;现在它所包含的范围比它的祖先所能想象的要广得多。要想在修复PHP代码时进行彻底的工作,你需要使用一个合格的工具。有许多优秀的扩展和工具可供选择,但Xdebug是一个有争议的领跑者。

正如我们所看到的,Xdebug可以适应甚至是最折衷的代码编辑器的口味,当它与PhpStorm搭配时尤其出色。然而,无论你的设置如何,通常都会有一个Xdebug的版本来满足你的需求。总的来说,它是一个强大、灵活和直观的工具。

评论留言