PHP调试必经之路xdebug

在我刚从事PHP开发的初期,一次偶然的机会,知道PHP有一个专门用来调试的工具“xbebug”,当时就抱着好奇的心态去了解它,没想到我会用时就感觉像是打开了新世界的大门样的,现在想想还真是有点搞笑,现在开通了博客后,我就想着把我所学的全部整理成日志,若是以后遗忘了,也可以再翻出来看看,同时也是希望那些PHP初学者看到这篇文章之后能够少走一些弯路,毕竟走过的才知道这条路到底有多难!废话少说,现在就来开始介绍PHP xdebug 本地调试以及远程调试的步骤。

xdebug安装就不多做介绍了,毕竟win和linux上安装方式不一样,现在就默认已经给PHP安装好了xdebug扩展,下面是xdebug的配置文件,在php.ini文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Xdebug]  
;指定Xdebug扩展文件的绝对路径
zend_extension="/usr/local/php5/zend_ext/xedbug.so"
;启用性能检测分析
xdebug.profiler_enable=on
;启用代码自动跟踪
xdebug.auto_trace=on
;允许收集传递给函数的参数变量
xdebug.collect_params=on
;允许收集函数调用的返回值
xdebug.collect_return=on
;指定堆栈跟踪文件的存放目录
xdebug.trace_output_dir="/tmp/log/php/debug"
;指定性能分析文件的存放目录
xdebug.profiler_output_dir="/tmp/log/php/debug"
xdebug.profiler_output_name = cachegrind.out.%t.%p

以上是本地调试的配置方式,远程调试与这大体相同,随后将奉上远程调试配置方式及详细说明,配置好了xdebug后(phpinfo能够看到xdebug扩展)接下来就来使用这个扩展来进行调试了,其中需要注意两个配置,第一就是xdebug.profiler_enable这个配置开启后,会在配置的性能分析文件的存放目录中自动生成cachegrind.out文件,该文件保存的是整个请求程序运行的性能分析数据,第二就是xdebug.auto_trace配置,该配置是开启自动代码运行跟踪,保存的是代码运行每一步的数据,开启后保存的是整个请求周期代码运行的跟踪数据,项目太大记录的数据更多那么这个文件也会相应的变大,所以一般配置时很少开启这个因为有时只需要跟踪某个函数或对象的运行情况,如果只要跟踪代码片段只需要在跟踪的代码加上以下代码即可:

1
2
3
xdebug_start_trace();
//* 业务代码 *
xdebug_stop_trace();

值得注意的地方就是当配置 xdebug.auto_trace=on 时,xdebug_start_trace()函数会报错,所以一般配置 xdebug.auto_trace=off ,在需要跟踪的地方手动加入调试代码即可。

在实际开发中还是很少用到上面的调试方式的,毕竟太麻烦了,而且xdebug输出的文件看的有点杂乱无章,无形增加了调试难度,有没有一种更友好的调试方式呢?当然有!配合IDE调试简直不要太舒服,这种调试就是俗称的远程链接调试,只不过我们开发跟服务都是在同一台电脑上,所以看起来像本地调试,但实际调试与程序之间数据是通过网络传输的,远程调试呢肯定是不能用上面的配置文件的,所以需要从新配置一个xdebug配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Xdebug]
;指定Xdebug扩展文件的绝对路径
zend_extension="/usr/local/php5/zend_ext/xedbug.so"
;开启远程调试
xdebug.remote_enable = on
;关闭性能检测分析(不输出分析文件了)
;xdebug.profiler_enable = off
;xdebug.profiler_enable_trigger = off
;xdebug.profiler_output_dir="D:\phpStudy\tmp\xdebug"

;2.1或以上版本只支持’dbgp’作为协议,所以这个值基本是固定的
xdebug.remote_handler = dbgp
;调试的机器的所在ip,如果是本机开发则写localhost即可
xdebug.remote_host = localhost
;调试机器的端口,选择一个不被占用的端口即可
xdebug.remote_port = 9001
;调试IDE标识
xdebug.idekey="PHPSTORM"

以上配置仅满足于本机当做服务器的情况下,当我的服务器是虚拟机虚拟出来的怎么办,其实一样的,改一改相应配置就行了,比如虚拟机地址是 192.168.10.10 ,本机的地址肯定就是 192.168.10.1 了,那么配置就如下:

1
2
3
4
5
6
7
;指定Xdebug扩展文件的绝对路径  
zend_extension="/usr/local/php5/zend_ext/xedbug.so"
xdebug.remote_enable = on
xdebug.remote_handler = dbgp
xdebug.remote_host = 192.168.10.1
xdebug.remote_port = 9001
xdebug.idekey="PHPSTORM"

其中xdebug.remote_port配置的也是调试机器的端口,所以被占用的话就需要更换了,以上的配置虽然能进行远程调试,但是只能单独一个人进行调试,如果需要多个开发都能调试,就必须用到另外一个配置 xdebug.remote_connect_back,把 xdebug.remote_host 去掉换成 xdebug.remote_connect_back=1 即可,换成这个配置后 xdebug 是通过 HTTP 头部来获取 IP 地址,这样也就支持多人调试了,但要记住的是这个配置千万不能在生产环境中出现,为什么你懂得!正常来说生产环境应该来 xdebug 都不应该开启的,但凡事都有特殊。

一切都配置完毕了后,重启服务,就开始配置IDE了,我用的是PhpStrom,所以就介绍这个了,配置起来也比较简单

写好后只需要运行一遍代码就行了,对没错,可以了,要看到调试的代码到底调用关系以及函数参数怎么办呢?看到上面配置的性能分析文件目录没有,就是在那里看,打开目录里面的文件就可以看到了,是不是感觉这样看的好难受,根本就没有像其他语言调试那种快感,要达到这种要求,就需要引入IDE了,我用的是PhpStrom,应该没有哪个phper不知道这个的吧,像其他的比如Sublime Text我也用来调试过,都没有PhpStrom这么爽,所以下面来介绍PhpStrom配置吧,配置这种描述是描述不清楚的,上图:

docker
docker
docker
docker
docker

配置 DBGp Proxy 的 Host 时候如果是远程服务器就需要填上远程服务器的 IP 地址,比如上面 xdebug 配置了一个 192.168.10.10 的远程服务器,那么此时这里的 host 就应该填上 192.168.10.10,其中配置 Server 的时候也需要特别注意,如果是本机做服务器的话就不需要配置目录映射,也就是在 Absolute path on the server 不需要填写内容,如果是通过远程服务器或者虚拟机做服务器的话就需要填上源码在远程服务器上的绝对路径,自此一切配置都以完成,就可以开始打上断点愉快的调试代码
了 ^v^ …