Visual Studio Code + PHP + VirtaulBox +XDebug 代码调试

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 文件。如图所示:

001.png

记得这个设置按钮左边下拉框选择:"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 浮动栏无其它报错,应该就成功了。 打开浏览器,访问项目中设置了断点的功能或页面,编辑器中会自动中断在断点处。

002.png

在浏览器访问这个设置了断点的程序后,会自动在断点位置中断。通过 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 是默认客户端与绑定的调试客户端关连端口。许多客户端都用此端口号,建议最好不要改。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容