正如任何一个开发者可以证明的那样,代码在初稿之后永远不可能为生产做好准备。开发过程中的一个关键部分是调试–删除或改变代码中所有不工作的部分。
PHP的Xdebug扩展是一种流行的方法,可以根除并摧毁你代码中的所有bug。
Xdebug的一个伟大方面是它的灵活性。无论你喜欢哪种框架或开发环境,你都能找到适合你工作流程的Xdebug版本。从这里开始,掌握这个工具不会花很长时间。
本教程将深入研究Xdebug,包括安装过程、将其集成到你的设置中,以及一般使用方法。
首先,让我们给你更多关于Xdebug是什么和它做什么的背景。
- Xdebug介绍
- 为什么要使用Xdebug?
- 如何开启PHP错误日志
- 如何使用Xdebug
- 结合PhpStorm使用Xdebug
- 命令小贴士
Xdebug介绍
Xdebug是最流行的调试PHP代码的扩展之一。你将在你选择的环境中安装它,它充当一个 “步骤调试器”。
Xdebug logo
简而言之,这使你能够逐行处理你的代码,这样你就可以逐步查看代码在你的程序中是如何行动和互动的,以及调查其输出。从那里,你可以根据你的需要进行修改。
不过,Xdebug可以做得更多。
- 你可以使用一套指标和可视化的方法来分析你的代码的性能。
- 当你运行PHP单元测试时,你可以看到你运行和执行的代码套件。
- Xdebug包括 “跟踪 “功能,它将把每个函数的调用写到磁盘上。这将包括参数、变量赋值和返回值。
- Xdebug还对标准的PHP错误报告做了改进。我们将在后面介绍更多这方面的内容。
鉴于这些特性,有很多方法可以在你的工作流程中使用Xdebug(以及任何类似的调试器)。我们将在下一节中介绍这些。
为什么要使用Xdebug?
许多开发者不会有一个专门的调试工作流程,使用第三方工具和扩展。这是因为 PHP 包含了它自己的基本错误记录。你会使用as error_log
, var_dump
和print
等命令来查看变量和函数调用的结果。
例如,有很多片段你可以重新用于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标志
好消息是,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信息界面
注意你可能需要用 sudo brew services restart php
来重启PHP,同时用 php --info | grep xdebug
来检查你的系统安装Xdebug是否正确。你会注意到输出中的Xdebug专用行:
从这里,你可以寻求将Xdebug纳入你选择的编码编辑器中。
XAMPP
与Valet一样,XAMPP的过程也有几个部分。然而,Windows和macOS版本有两个不同的过程。
首先安装XAMPP,然后快速检查你的系统中是否存在php_xdebug.dll文件(Windows)或xdebug.so文件(macOS)。
显示XAMPP文件测试的终端窗口
如果该文件存在,就可以继续配置了。否则,首先需要下载适合Windows的二进制文件–为你喜欢的PHP版本下载一个64位的文件–或者如果你用的是Mac,则需要安装更多的依赖项。
对于 Windows,重命名 DLL 文件 php_xdebug.dll,然后把它移到 xamppphpext 文件路径中。接下来,在你喜欢的代码编辑器中打开xamppphpphp.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界面
JetBrains 网站包括连接 Xdebug 和 PhpStorm 的完整说明,但我们将在此回顾一下。
首先,在Preferences窗格中导航到Languages & Frameworks > PHP页面。在这里,打开CLI Interpreter下拉字段旁边的More Items串菜单:
在PhpStorm中选择一个CLI解释器
这将显示一些关于你的 PHP 版本和解释器的进一步细节。如果你点击Configuration file选项旁边的More items省略号,你会看到php.ini文件的完整路径。
在PhpStorm中修改PHP配置
接下来你将使用这个PHP文件来继续设置过程
在php.ini文件中工作
这里的第一个任务是编辑出任何影响 Xdebug 如何与 PhpStorm 一起工作的行。
在 php.ini 文件中,寻找以下几行,并将其删除或注释掉。
zend_extension= zend_extension=
这些行不会在所有情况下出现,所以如果你没有看到它们,不要惊慌。
接下来,在文件中添加以下内容。
[xdebug] zend_extension="xdebug.so" xdebug.mode=debug xdebug.client_host=127.0.0.1 xdebug.client_port=""
关于这套代码,有几件事需要注意。
- 你可能已经有一个
[xdebug]
部分,在这种情况下你可以省略第一个指定。 -
zend_extension
条目可能需要你添加xdebug.so的完整路径来连接。 - 虽然它可能看起来像一个占位符,但
xdebug.client_port
参数是你在代码内的设置方式。
一旦你添加了这些,保存并关闭文件,然后从命令行测试PHP版本(使用 php --version
)。
使用macOS终端测试PHP和Xdebug的当前安装
如果你有一个工作版本的Xdebug,它将显示为PHP扩展之一。你也可以将 phpinfo();
添加到一个新文件中,并在浏览器中进行测试。
这就是让Xdebug作为PhpStorm的默认调试器所需要做的一切。使用它之前的最后一步是安装一个浏览器辅助扩展。
安装一个浏览器辅助扩展
你需要在你的浏览器和 PhpStorm 之间建立的最后一个关键连接,是通过激活服务器上的步骤调试来完成的。虽然你可以在命令行中使用特殊的 GET
或 POST
值来做这件事,但使用一个扩展是更直接的。
我们推荐使用专用的Xdebug Helper扩展。你可以在你选择的浏览器上安装它:
- Xdebug Helper for Chrome/Chromium/Brave
- Xdebug Helper for Firefox
- Xdebug Helper for Safari
如果你想探索其他扩展,JetBrains网站为最流行的浏览器提供了一些额外的选择。
一旦你安装了你选择的浏览器扩展,你不应该再调整任何进一步的配置设置。从这里,你可以开始使用PhpStorm的Xdebug。
使用Xdebug
虽然我们在这里使用PhpStorm,但你会看到不同IDE之间有类似的布局和界面–尽管也会有一些明显的区别。
有几个概念结合起来形成了整个调试体验。
- 断点。这些点是Xdebug会停下来让你检查输出的地方。你可以根据自己的需要设置任意多的断点。
- 监听连接。你可以打开或关闭这个功能,尽管大多数开发者总是把它打开。
- 调试屏幕。你的大部分时间将在调试界面中度过–你将在这里处理各种代码行、变量和参数。
第一步是激活监听–没有监听,你就无法调试任何东西。要做到这一点,请点击工具栏上的Run > Start Listening for PHP Debug Connections选项。
在PhpStorm中打开的运行菜单
作为一种选择,你可以点击PhpStorm工具栏中的 “telephone”图标:
使用PhpStorm工具条内的电话图标监听PHP调试连接
这两个选项中的任何一个都会开始监听连接。
从这里,你可以开始在代码编辑器的沟槽中设置断点。一个红点表示一个断点,你可以点击它来激活:
在PhpStorm编辑页面的沟槽内设置断点
当你想调试你的代码时,最直接的方法是开始监听,设置断点,然后前往浏览器中的特定页面。在浏览器中找到你的扩展图标,然后点击它,选择 “Debug”选项:
在浏览器工具栏内选择调试选项,使用一个专门的扩展
这将在PhpStorm中打开调试器并提供好消息或坏消息:
使用PhpStorm调试器与Xdebug
如果你右键单击各种值、属性、参数和变量,你将能够访问一个进一步的上下文菜单。这为你提供了大量的额外空间来测试和调试你的代码:
在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:/// -n |
在给定文件路径的指定行上设置一个断点 | run |
步入下一个可执行行 | step_into |
列出当前范围内的变量和值 | context_get |
显示指定属性的值 | property_get -n |
虽然您的特定代码编辑器将有自己的专用快捷方式,但这里的重点是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中使用查找动作菜单
一旦你开始在这个空间里打字,你就会看到一个动态的命令和相关的快捷键列表。你还可以通过Help > Keyboard Shortcuts PDF菜单找到所有键盘快捷键的PDF版本。
如果你想在使用鼠标工作时更多地实时查看快捷方式,JetBrains提供了Key Promoter X插件。
PhpStorm界面显示Key Promoter X的通知
这个方便的工具将显示你最近执行的动作的通知,以及其相关的键盘快捷键。一旦你学会并使用了这些快捷键,你就可以逐步淘汰这个插件,恢复你屏幕上的宝贵空间。
小结
调试的实践已经从它卑微的开始走过了漫长的道路;现在它所包含的范围比它的祖先所能想象的要广得多。要想在修复PHP代码时进行彻底的工作,你需要使用一个合格的工具。有许多优秀的扩展和工具可供选择,但Xdebug是一个有争议的领跑者。
正如我们所看到的,Xdebug可以适应甚至是最折衷的代码编辑器的口味,当它与PhpStorm搭配时尤其出色。然而,无论你的设置如何,通常都会有一个Xdebug的版本来满足你的需求。总的来说,它是一个强大、灵活和直观的工具。