PHP中如何使用Xdebug总结

PHP调试跟踪之XDebug使用总结:

Xdebug是一个开源的PHP程序调试工具,可以使用它来调试、跟踪及分析程序运行状态。当然,Xdebug需要结合PHP的编辑工具来打断点、跟踪、调试及分析,比较常用的PHP的Xdebug调试环境:Vim +Xdebug。

 

·     安装配置

·     调试环境

·     跟踪分析

·     注意事项

·     遇到问题

 

一、安装配置

1、安装

Xdebug的安装是作为PHP的拓展而存在的,所以可参考PHP拓展文章:

http://blog.csdn.net/why_2012_gogo/article/details/51120645

 

2、配置

php.ini:

[xdebug]

;基本调试配置

xdebug.auto_trace = on

xdebug.collect_params = on

xdebug.collect_return = on

xdebug.profiler_enable = on

xdebug.profiler_output_dir ="/php/ext/xdebug_profilers"

xdebug.trace_output_dir = "/tmp/ext/xdebug_traces"

;远程调试设置

xdebug.remote_enable = on

xdebug.remote_host = localhost

xdebug.remote_port = 9010

xdebug.remote_autostart = on

 

zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so

 

NOTE:

上面罗列的是最为常用的配置选项,至于其他配置选项及对应的含义,请参考:

https://xdebug.org/docs/all_settings#auto_trace

 

二、调试环境

Vim + Xdebug:

1、下载

http://www.vim.org/scripts/script.php?script_id=1929

2、配置

$ cd  ~

$ sudo mkdir ~/.vim

将上面下载的xdebug的plugin中文件复制到.vim下:

$ sudo cp –r /php/ext/plugin  .

在用户主目录下创建.vimrc文件:

$ sudo touch /usr/share/vim/vimrc  ~/.vimrc

$ sudo vim ~/.vimrc

为.vimrc添加以下内容:

let g:debuggerPort = 9010(该端口必须与xdebug.remote_port相同)

let g:debuggerMaxDepth = 5(代表数组调试深度配置)

 

NOTE:

vimrc文件是vim的主要配置文件,它包含两个版本:全局版本和用户版本,我们建议修改用户版本的vimrc配置文件,这两种版本的路径可在vim普通模式下查看,如下:

 

全局版本路径查看:

$ sudo vim

$ :echo $VIM

路径地址:/usr/share/vim

 

用户版本路径查看:

$ sudo vim

$ :echo $HOME

路径地址:$HOME(pwd ~)

 

注意:

g:debuggerPort的端口号,必须与xdebug.remote_port相同;

g:debuggerMaxDepth代表的是脚本调试的最大深度层次;

 

最后,修改完php.ini、.vimrc配置后,记得重启php-fpm。

 

3、调试

A、准备一个php文件

<?php

 $value = '马上使用XDebug调试程序,你准备好了吗';

 echo $value;

?>

将上面的文件放入到你的Web根目录下,我的访问地址是:

http://localhost/xdebug.php 测试下是否正常显示。

 

B、使用vim打开php文件

使用vim普通模式打开php文件,移动鼠标箭头到欲调试的那行,输入:

$:Bp

截图如下:

然后,按下F5(Mac:Fn+F5),开始监听调试事件,这时在编辑窗底部提示5秒内访问要调试的php文件,例如:

http://localhost/xdebug.php? XDEBUG_SESSION_START=1

 

截图如下:

对于调试中的操作在下面附加上:

类型

功能

说明

<Command Mode>

 

 

:Bp

 toggle breakpoint

断点标记

:Up

 stack up

 

:DN

 stack down

 

<Normal Mode>

 

 

,e

 eval

 

<Function Keys>

 

 

F1

 resize

调整窗口大小

F2

 step into

调试步进入

F3

 step over

调试步进入下一标记

F4

 step out

调试步出当前标记

F5

 run

调试运行

F6

 quit debugging

退出调试模式

F11

 get all context

获得所有变量内容

F12

 get property of cursor

获得当前光标变量

 

 

三、跟踪分析

1、代码覆盖分析

Xdebug 2.2开始支持对代码覆盖的分析,也就是通过对代码的覆盖分析,我们可以了解到在IDE访问期间,有哪些代码行数被执行了,有助于对核心代码和单元测试有针对性的了解和分析,最终提高代码的质量。

A、涉及的配置

xdebug.coverage_enable=1

//该配置默认为1,也就是默认开启,如果设置为0,代码的覆盖分析就不会进行。

 

B、涉及的函数

boolean xdebug_code_coverage_started()

//该函数返回布尔值,用来判断代码覆盖分析功能是否开启,未开启则返回false。

 

void xdebug_start_code_coverage( [int options] )

//该函数没有任何返回,它的作用是开始搜集分析结果集数据,数据是以二维数组形势//存在,一维参数为分析的文件名字,二维参数为对应的分析行数;另外,在分析文件

//的每行代码时,都会产生一个结果码,如下:

//1:代表代码已经执行;

//-1:代表代码未被执行,对应函数参数XDEBUG_CC_UNUSED传入;

//-2:代表没有可执行的代码存在,对应XDEBUG_CC_DEAD_CODE和XDEBUG_CC_UNUSED

 

NOTE:

XDEBUG_CC_UNUSED:用来计算分析时包含搜集未被执行的代码;

XDEBUG_CC_DEAD_CODE:用来计算分析时代码行是否被执行;

 

形式如下:

xdebug_start_code_coverage(XDEBUG_CC_UNUSED|XDEBUG_CC_DEAD_CODE);

 

array xdebug_get_code_coverage()

//该函数返回数组值,用来搜集和返回代码覆盖分析的结果集信息。

 

void xdebug_stop_code_coverage( [int cleanup=true] )

//该函数不返回任何值,用来停止覆盖分析,如果传入参数为true,那么就会停止分析并清空内存中的分析结果集,否者传入false,反之,还可使用//xdebug_start_code_coverage找回该内存信息。

 

C、示例的验证

Php代码:

<?php

echo '覆盖分析进行中...</br>';

 

// 构建封装对象

class XdebugCoverageAnalysisModel {

      private $_coverage_info;

      private $_status;

 

      function __construct() {

          $this->_coverage_info = xdebug_get_code_coverage();

          $this->_status =xdebug_code_coverage_started();

        }

 

      // 获取分析结果

      public functiongetCodeCoverageResult() {

           returnjson_encode(xdebug_get_code_coverage());

      }

 

      // 开启覆盖分析

      public functionxdebugStartCodeCoverage() {

            xdebug_start_code_coverage( -1 | -2 );

        }

 

      // 分析是否执行

      public functionxdebugCodeStarted() {

           return xdebug_code_coverage_started();

      }

}

 

// 初始化

$apiModel = new XdebugCoverageAnalysisModel();

 

echo '开启覆盖分析...</br>';

$apiModel->xdebugStartCodeCoverage();

 

// 定义一个测试函数

function coverageSample($a,$b) {

   echo '函数结果:'.($a * $b).'</br>';

}

 

echo '判断是否开启...</br>';

$status = $apiModel->xdebugCodeStarted();

if($status=='1') {

  echo '开启覆盖分析已完成</br>';

} else {

  echo '开启覆盖分析失败了</br>';

}

 

echo '测试函数开启...</br>';

coverageSample(10,10);

 

echo '获取分析结果...</br>';

$result = $apiModel->getCodeCoverageResult();

echo $result.'</br>';

 

echo '关闭分析开关...</br>';

xdebug_stop_code_coverage();

 

$status = $apiModel->xdebugCodeStarted();

if($status=='1') {

  echo '覆盖分析已经完成</br>';

} else {

  echo '覆盖分析已经关闭!</br>';

}

 

unset($result);

unset($apiModel);

 

?>

 

浏览器结果:

 

2、PHP脚本分析

Xdebug的PHP脚本分析功能比较实用,它可以帮助我们分析代码的瓶颈和影响性能缓慢的问题,为优化代码提供可行性的参考。

 

A、涉及的配置

xdebug.profiler_enable

//该配置默认为0,为开启,设置为非0之后,即开启profiler功能

xdebug.profiler_output_dir

//该配置为上面开启之后,存放生成分析文件的位置,需要保证位置可写入,默认/tmp

xdebug.profiler_enable_trigger

//如果开启该选项,则在每次请求中如果GET/POST或cookie中包含//XDEBUG_PROFILE变量名,则才会生成性能报告文件(前提是必须关闭

//xdebug.profiler_enable选项,否则该选项不起作用)。

xdebug.profiler_output_name

//可以使用该配置修改生成的分析文件,默认cachegrind.out.%p

 

NOTE:

建议使用xdebug.profiler_enable_trigger替代xdebug.profiler_enable

 

B、涉及的函数

string xdebug_get_profiler_filename()

//返回类型为字符串,用来返回分析的文件名字

 

C、示例的验证

当我们开启分析开关之后,当有脚本运行就会在指定的位置生成格式为cachegrind.out.xxx的分析文件:


该文件的内容不是很直观,所以需要使用可视化的工具来查看和分析,而Xdebug本身就支持使用第三方的可视化profiler文件的内容。在Linux下,可以使用KCacheGrind,而在Windows平台,可以使用QCacheGrind,当然还有一些在线的由爱好者开发的工具,例如:WebGrind,具体怎样使用这些工具,可以参考:

https://xdebug.org/docs/profiler

下面罗列下,WebGrind的效果:

 

WebGrind可以在这里下载:

https://github.com/jokkedk/webgrind

 

四、注意事项

1、避免生产环境开启profiler和trace,只需开启远程调试;

2、尽量使用xdebug.profiler_enable_trigger替代xdebug.profiler_enable;

3、如果使用webgrind分析profiler,建议不要放入生产环境,因为其没有安全限制,任何人都可以访问;

4、Xdebug的功能虽然强大,但是要均衡性能开销;

 

五、遇到问题

问题:Error("DbgProtocol instance has no attribute 'stop'",)

产生该问题的原因大致如下:

A、配置文件配置不正确;

B、.vimrc和php.ini中的port不相同;

C、.vimrc和php.ini中的port与现有的port冲突;

解决:

对照上面的几条仔细查看配置即可。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Xdebug 是一个用于 PHP 的调试器和分析器。它可以帮助您跟踪代码执行、查看变量值和调用堆栈等。要使用 Xdebug,您需要在 PHP 安装和配置它。步骤如下: 1. 下载并安装 Xdebug 扩展。 2. 编辑 php.ini 配置文件,启用 Xdebug 扩展。 3. 设置 IDE 或编辑器来使用 Xdebug。 4. 使用 Xdebug 进行调试。 如果您使用的是 Windows 系统,可以使用 PECL 命令安装 Xdebug: ``` pecl install xdebug ``` 如果您使用的是 Linux 系统,可以使用以下命令安装 Xdebug: ``` sudo apt-get install php-xdebug ``` 然后,编辑 php.ini 文件启用 Xdebug 扩展: ``` zend_extension = /usr/lib/php/20151012/xdebug.so ``` 并设置 IDE 或编辑器来使用 Xdebug 进行调试,例如在PhpStorm设置即可。 如果您想了解更多关于 Xdebug 的信息,请访问官网:https://xdebug.org/ ### 回答2: PHP Xdebug 是一个用于调试 PHP 程序的工具。它提供了一些强大的功能,帮助开发人员在开发和调试过程更加高效地查找和解决问题。 使用 Xdebug 的第一步是将其安装到 PHP 环境。一般来说,可以通过厂商提供的包管理器(如 PECL),或者手动下载源代码编译安装。安装完成后,需要在 PHP 配置文件启用 Xdebug 扩展。 一旦安装和启用 Xdebug,我们就可以开始使用其提供的功能了。其最常用的功能是代码断点调试。我们可以在代码设置断点,当程序执行到断点时会停下来,然后可以逐行查看代码的执行路径、变量的值以及调用堆栈等信息。可以使用调试器(如 PhpStorm、NetBeans 或者 Xdebug 自带的命令行工具)来与 Xdebug 进行交互。 除了断点调试,Xdebug 还提供了一些辅助功能。例如,它可以生成代码覆盖率报告,帮助我们了解代码的执行情况以及哪些部分没有被覆盖到。另外,Xdebug 还可以记录函数的调用时间和内存消耗,用于性能分析和优化。 为了更好地使用 Xdebug,我们可以在 PHP 配置文件进行一些配置。我们可以设置远程调试(Remote Debugging),允许通过网络连接到远程服务器进行调试。我们还可以设置日志记录(Logging),将调试信息写入日志文件,以便以后分析。 总之,PHP Xdebug 是一个非常实用的工具,可以帮助开发人员更加高效地进行 PHP 程序的调试。使用 Xdebug 可以快速定位和解决问题,并提高代码的质量和性能。 ### 回答3: PHP Xdebug 是一个可以提供调试、分析和优化 PHP 程序的强大工具。它为开发者提供了一系列的功能,帮助我们更方便地进行代码调试和性能分析。 首先,Xdebug 提供了强大的调试功能,可以让我们在 PHP 程序设置断点,然后逐行调试代码。通过启用 Xdebug,我们可以在代码插入断点,以便在执行到断点时暂停程序并检查变量的值以及代码执行流程。这对于定位代码的错误和调试复杂的程序非常有帮助。 此外,Xdebug 还可以生成详细的运行时日志,可以帮助我们追踪程序的执行流程和变量的变化。我们可以通过在配置文件设置相应的参数,让 Xdebug 追踪和记录程序的每一步操作,以及输出和记录变量的值。这对于分析程序的执行顺序和检查变量的变化非常有用,可以帮助我们更好地了解程序的行为。 除了调试和日志功能,Xdebug 还提供了一系列的性能分析功能。它可以生成函数调用图,并统计函数的执行时间和调用次数,从而帮助我们发现程序的性能瓶颈。通过分析 Xdebug 生成的报告,我们可以定位到执行时间较长的函数,并优化它们以提高程序的性能。 总结来说,PHP Xdebug 是一个非常有用的工具,它可以帮助我们更好地调试、分析和优化 PHP 程序。通过使用 Xdebug,我们可以快速地定位代码的错误,了解程序的执行流程和变量的变化,以及发现和优化程序的性能瓶颈。它是 PHP 开发者不可或缺的一款工具
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值