从 var_dump 到 Xdebug

目录
[隐藏]

这次的标题和文章内容似乎契合度不是很高,但管他什么标题呢,就是想写点东西,想把学到的记录下来

1、PHP 调试

使用 PHP 以来,基本调试都是靠 echovar_dumpdie 等搞定(接触的都是比较简单的流程...)
介绍两个不常用的 debug 函数:

debug_zval_dump():看到有 zval 应该就能猜到和 PHP 底层变量实现有关了,没错,这个函数输出的内容就是在 var_dump 输出内容的基础上,增加了一个值 refcount (引用计数器)。这个 refcount 记录了一个变量被引用了多少次,这也是 PHP 写时复制的一个重要特点

关于 PHP 写时复制可参考:http://www.nowamagic.net/librarys/veda/detail/144

debug_print_backtrace():输出程序的调用栈,适用于 递归 或 嵌套 时进行调试。

1.1 Xdebug 和 PhpStorm

Xdebug 作为 PHP 的一个扩展,安装和其它扩展模块是一致的,这里就不再赘述了(在 wamp 这种集成开发包中 Xdebug 通常已经安装好了,只需要开启一下就 OK)
Xdebug 扩展通常都会搭配 IDE 进行断点调试(这里以 PhpStorm 为例)
使用 PhpStorm 进行断点调试实际上还是使用 Xdebug 等工具

从上图可以看出,点击 debug 调试实际上就是使用 Xdebug 模块。

1.1.1 Xdebug 断点调试  

Xdbug 的功能是非常强大的,通过配置项进行设置,先说下断点调试功能。

网上大都是把所有配置项一股脑放上来,但如果只需要断点调试,配置其实非常简单如下:

zend_extension = "D:/wamp/bin/php/php5.5.12/zend_ext/php_xdebug-2.2.5-5.5-vc11-x86_64.dll"

就是开启扩展就可以啦~~

在调试之前需要先了解 PhpStorm 对于 运行/调试 是可以进行配置的,可以配置不同的 运行/调试 类型。

可以点击箭头指向的下三角形选择“编辑结构”,或者点击菜单栏的 “运行”在弹出的下拉菜单中选择 “编辑结构” 这两种方式进入 运行/调试 配置界面(界面如下)

箭头1 指向的 “PHP Script”类型就是用于单一 PHP 文件的;箭头2 指向的 “PHP Web Application”类型就是用于 PHP Web应用程序(简单说就是一个完整的项目,多个文件。。)的。

“PHP Script" 调试例子:

假设有 index.php 文件,内容和添加的断点(在要断点位置的行号边点一下就添加了)如下

从 箭头2 可以看到,添加断点后,运行/调试 栏都是灰的不可点击(因为没有配置 运行/调试 类型),可以通过下三角形“编辑结构”配置,不过更常用的是在要调试的 PHP 文件上,右键选择调试:

调试 似乎有两个选择,上面一个是以 JavaScript Debug 的方式进行调试,下面一个才是以 PHP Script 方式调试。当然选择后者,用于调试的界面如下:

调试界面 这些按钮功能就不介绍了,都比较简单,实际操作一下就知道了。

在调试后,再看下 运行/调试 栏:

可以看到,运行/调试 栏已经可以点击了,而且是以一个名为 “index.php”的配置进行 运行/调试的。
看一下这个 "index.php" 的配置内容:

使用的果然是前面分析对于单一文件是 PHP Script 类型,名称自动使用了文件名(可自行修改),然后指定了一下 File 。
  "PHP Web Application" 调试例子:

对于 PHP Web Application 的断点调试,前面需要的配置稍微麻烦一点,但想想也是必需的。

首先需要在 php.ini 中添加一些允许远程调试的配置:

Xdebug.remote_enable = on   (这里是本地服务器,所以其它就不配置了,最后会列出)

(这里假设已经用 PhpStorm 部署本地项目到服务器了)
第一步:为项目配置一个 PHP Web Application 类型的 运行/调试 方式,如下:

Server: 就是 Xdebug 所在的服务器(点击右侧 ... 进行设置)

Start URL:是在浏览器中的路径

Browser:指定用那个浏览器打开

看下 Server 的配置:

Host:服务器地址(这里是本地所以填 localhost / 127.0.0.1)

Port 和 Debugger 默认是 80 和 Xdebug(可以下拉选择 Zend Debugger)

另一个关键是要勾选 “Use path mapping....”使用路径映射,然后在下方将要调试的 本地文件 和 服务器 上文件映射起来(如下面那个箭头所指)。

接着就要监听 Debug 连接:

点击箭头所指的按钮,启动后,红色禁止标识会变成绿色。然后设置好断点就可以点击臭虫开始调试了

调试已经开始,但是似乎有些问题发生了。变量栏 中第一行红色字体给出了问题原因(服务器上某个文件在本地没有映射),第二行点击可以进行映射设置。点击后弹出如下窗口:

这里会直接定位到需要映射的文件,映射完后如下:

点击“确定”后,变量栏 中的错误信息和提示就会消失了,然后重新开始调试

箭头1:这个区域显示了执行到这个文件的过程(在复杂流程下,这正是我们非常希望看到的)

箭头2:断点处变量值

箭头3:PhpStorm 会在断点位置后面显示值

箭头4:点击这个可以重新开始调试
至此,使用 PhpStorm + Xdebug 进行断点调试就完成了,并没有那么复杂,实际操作一下就比较熟悉了。

2、Xdebug 性能检测和分析

接下来就是 Xdebug 断点调试以外的功能了 “性能监测 ”需要在 php.ini 中添加一些 Xdebug 配置:

Xdebug.auto_trace = on                ;启用函数追踪

Xdebug.collect_params = on            ;将 PHP 对函数调用的参数加入函数过程调用的监测中

Xdebug.collect_return =on             ;将函数调用的返回值加入函数过程调用的监测中

Xdebug.trace_output_dir = "xxxx"      ;指定函数调用监测信息的存放目录

Xdebug.trace_outpu_name = xxxxx       ;指定函数调用监测信息的文件名

上述这些配置项用于启用 函数调用过程 追踪,Xdebug 会将请求文件中所有函数调用情况都存放在指定文件下,查看这些文件内容,就能很清楚的看到文件中函数的调用过程。

Xdebug.profiler_enable = on             ;启用性能分析

Xdebug.profiler_enable_trigger = on     ;只在请求中带有XDEBUG_PROFILE参数时才会生成性能报告文件,

且需要关闭 profiler_enable 否则无效。

Xdebug.profiler_output_dir = "xxxx"     ;指定性能分析报告存放目录

Xdebug.profiler_output_name = xxxxx     ;制定性能分析报告的文件名

配置这几个基本选项后,Xdebug 会在请求 PHP 文件时,在每个函数运行前和运行后插入一个监控点,计算每个函数的运行时间,然后将统计结果输出到性能分析报告中。不过格式不利于直接观察, 通常会使用其它工具来查看,例如 WinCacheGrind 等。

这些功能都只是负责记录然后输出一大堆信息,最终还是需要人去对输出结果进行分析,找出问题。使用这种方式进行性能检测和分析,一定要多次采样。

更多详细 Xdebug 请看:https://xdebug.org/docs/all_settings#auto_trace

没有实际使用过,这里只是作为一个记录。


插个题外话:PhpStorm 内置服务器

刚接触 PhpStorm 时,只知道不用启动其它服务器也可以通过浏览器访问,点击下面这些标记即可

      

但那个时候其实根本不知道为什么,看下面两个图就清楚了(在点击上述标记后发生的事)

  显然,通过响应头信息的 server 字段,能确定是 PhpStorm  内置了一个服务器。通过 PHP-CGI Server 我们也清楚了 PhpStorm 是通过 CGI SAPI 的方式在运行 PHP。
另外:PHP 5.4 后,也内置了一个Web 服务器,可以用于本地项目测试使用。PhpStorm 中的 PHP Built-in Web Server 类型就是使用了 PHP 的内置服务器。

关于 PHP 内置服务器参考:http://php.net/manual/zh/features.commandline.webserver.php

3、相关参考

https://yq.aliyun.com/articles/42743

https://zhuanlan.zhihu.com/p/26615449

http://www.jianshu.com/p/fdd36d73523c关于

http://blog.csdn.net/suitingwei/article/details/50515788

发表评论

电子邮件地址不会被公开。 必填项已用*标注

To