XDebug 是一个开放源代码的 PHP 程序调试器。可以用来跟踪、调试和分析 PHP 程序的运行状况。
对于简单的项目或者仅仅想知道某一位置的某个变量是什么值,直接使用 var_dump/exit 来打印和中断就可以了。而对于大型项目的调试,或想了解某个系统的整个运行过程,XDebug 可能会是更好的选择。
网上大多数 XDebug 教程中的项目代码和运行环境是配置在本地,IDE 也是在本地。而我使用的项目运行环境是运行于 VirtualBox 的虚拟机中,所以,XDebug 配置起来稍有不同。
环境介绍:
本地:Win7 + Visual Studio Code
服务器环境:CentOS7.3 + Nginx + MySQL + PHP + XDebug
虚拟机:VirtualBox
项目在本地系统当中,通过 VirtaulBox 共享文件夹功能挂载到虚拟机当中。虚拟机使用 NAT 方式联网。
1. 安装 XDebug 扩展
1.1)源码安装
$ wget http://pecl.php.net/get/xdebug-2.6.0.tgz
$ tar zxvf xdebug-2.6.0.tgz
$ cd xdebug-2.6.0
$ phpize
$ ./configure
$ make && make install
1.2)pecl 命令安装
pecl 命令是我们系统在安装 PHP 时同时安装到系统当中的。在 PHP 安装目录下的 bin 目录下。你可以查看到 php、phpize、php-config、phpecl 等常用命令。因为,我们把 PHP 的 bin 目录添加到了系统 PATH 中。所以,我们可以直接在命令行使用。
pecl 安装 XDebug 扩展非常简单。就一句命令,如下:
$ pecl install xdebug
2 配置 XDebug
2.1)在 PHP 配置文件 php.ini 当中增加 xdebug 扩展
打开 PHP 配置文件。如果,不知道配置文件在哪里。可以通过如下命令查看。
$ php --ini
Configuration File (php.ini) Path: /usr/local/php71/etc
Loaded Configuration File: /usr/local/php71/etc/php.ini
Scan for additional .ini files in: /usr/local/php71/etc/php.d
Additional .ini files parsed: (none)
执行会得到如上信息。准确告诉了我们 php.ini 文件的位置。然后,我们通过 vim 命令打开它,并在文件未必增加如下配置信息:
[xdebug]
zend_extension = xdebug.so
xdebug.profiler_enable = on
xdebug.remote_enable = 0
xdebug.remote_autostart = 1
;xdebug.remote_host = 192.168.28.65
xdebug.remote_port = 9000
xdebug.remote_connect_back = 1
xdebug.auto_trace = 1
xdebug.collect_includes = 1
xdebug.collect_params = 1
xdebug.remote_log = /tmp/xdebug.log
2.2 ) 测试 XDebug 扩展是否生效
要使用代码生效,我们必须重启一下 php-fpm 。
> /etc/init.d/php-fpm restart
因为在我的系统当中,已经把重启封装到了 /etc/init.d/ 目录下面。所以,如果你的系统不是这样。请按照原始的方式重启 PHP-FPM 吧。重启是为了待会调试而用。
重启之后,通过如下命令验证扩展是否存在。
> php -m|grep xdebug
如果执行此命令输出了 xdebug 说明已经安装成功了。
3 Visual Studio Code IDE 安装 PHP Debug 插件
在插件搜索框中输入“php debug” 即可点击安装。非常方便。这里不再赘述。
4 配置 launch.json
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Listen for XDebug",
"type": "php",
"request": "launch",
"stopOnEntry": false,
"localSourceRoot": "${workspaceRoot}",
"serverSourceRoot": "/data/wwwroot/codespace/myself/hunshijian",
"port": 9000
},
{
"name": "Launch currently open script",
"type": "php",
"request": "launch",
"program": "${file}",
"cwd": "${fileDirname}",
"port": 9000
}
]
}
launch.json 文件在哪?按组合快捷键:Ctrl + Shift + D 会打开断点调试界面。在左上角有一个设置按钮。点击这个按钮,就会打开 launch.json 文件。如图所示:
记得这个设置按钮左边下拉框选择:"Listen for XDebug" 哟。
launch.json 文件说明:
name | 给当前断点配置定义一个名称。一个配置文件里面可以配置多个。这个是针对 XDebug 进行配置。它会在上面截图设置按钮左边的下拉框中显示。 |
---|---|
type | 语言类型。设置为 php 就好了。其他语言没用过。 |
request | 暂时不知道何意。设置为 launch 即可。 |
stopOnEntry | 暂时不知道何意。设置为 false 即可。 |
localSourceRoot | 本地项目源码路径。因为在调试的时候,IDE 会从这个目录寻找代码。 |
serverSourceRoot | 服务器项目源码路径。 |
port | 本地 IDE 在 Debug 时监听的端口。 |
5 开始调试
工作区中在需要调试的文件中设置断点,F5 启动调试(Listen for XDebug),编辑器上方显示 debug 浮动栏无其它报错,应该就成功了。 打开浏览器,访问项目中设置了断点的功能或页面,编辑器中会自动中断在断点处。
在浏览器访问这个设置了断点的程序后,会自动在断点位置中断。通过 F11 快捷键,可以跟踪到后续每步的执行情况。在左侧会显示每个变量的值。
6 XDebug 在 php.ini 的更多配置说明
xdebug.extended_info
类型: integer, 默认值: 1
控制 xdebug 是否强制性开启 PHP 解析器的"extended_info"模式,这能让 Xdebug 在远端调试上做到文件/行号断点调试。当跟踪或分析脚本你通常想关闭此选项,因为 PHP 产生的数组会增加三分之一的大小减慢你的脚本。该设置只能在 php.ini 设置,不能在 ini_set() 内设置。
xdebug.idekey
类型: string, 默认值: complex
控制哪种 IDE 索引值可由 xdebug 传递到 DBGp 调试处理器。默认情况下是基于设置环境。首先环境设置 DBGP_IDEKEY 会被考虑,之后是 USER 和最后的 USERNAME。默认值会是找到第一个环境变量。如果确实找不到则该设置是默认""。如果该值有设置,它通常覆盖环境变量值。
xdebug.remote_autostart
类型: boolean, 默认值: 0
一般来说要使用一指定的 HTTP 的 GET/POST 变量启动远端调试(参考 Remote Debugging)。当设置为 1 时,Xdebug 会尝试启动一远端调试会话并试图连接到一客户端,即便是 GET/POST/COOKIE 变量并不存在。
xdebug.remote_connect_back
类型: boolean, 默认值: 0, 始于 Xdebug > 2.1
如果设置生效,xdebug.remote_host 设置会忽略而 Xdebug 会尝试给制造 HTTP 请求的客户端进行连接。它会检查 $_SERVER['REMOTE_ADDR'] 变量并找出使用的 IP 地址。请记住它没有有效的过滤,任何人都能启动调试会话连接到服务器,即使他们的地址并不匹配 xdebug.remote_host.
xdebug.remote_cookie_expire_time
类型: integer, 默认值: 3600, 始于 Xdebug > 2.1
用于增减远端调试会话的cookie存在时间。
xdebug.remote_enable
类型: boolean, 默认值: 0
该开关控制 Xdebug 试图与调试客户端通讯,客户端通过设置 xdebug.remote_host 和 xdebug.remote_port 侦听服务器和端口当。当设置为0,脚本仅仅是运行而连接不能被建立。
xdebug.remote_handler
类型: string, 默认: dbgp
可改为 'php3' 使用旧的 PHP3 样式调试器输出,'gdb' 能使 GDB 生效类似于调试器接口,或是 'dbgp' 使用调试器协议。DBGp 协议是唯一支持的协议。
注意:2.1或以上版本只支持'dbgp'作为协议。
xdebug.remote_mode
类型: string, 默认值: req
选择当调试连接的模式。有两种值:
req
当调试客户端一启动脚本运行,Xdebug 尝试连接到调试客户端。
jit
只有在错误发生时,Xdebug 才会连接到调试端。
xdebug.remote_port
类型: integer, 默认值: 9000
Xdebug 试图连接到远端服务器的端口。端口 9000 是默认客户端与绑定的调试客户端关连端口。许多客户端都用此端口号,建议最好不要改。