初拿到一套系统要进行二次开发就得快速了解其系统结构,遂在调试上花了不少功夫,以前也有类似的痛点但都不了了之,所以今决定深入一下PHP调试,以便以后都能做到更胸有成竹。

说到PHP的调试就不得不提Xdebug,这是PHP下最有名的调试扩展,甚至超过了Zend自家的Zend Debugger

Xdebug

安装

  1. 下载
    点击官网下载地址到达官网选择你要下载的包
  2. 安装

    • Windows用户下载的二进制包直接拷贝dll(动态链接库)文件到扩展目录下即可。
    • Unix Like系统源码安装。
    $ cd extname
    $ phpize
    $ ./configure
    $ make
    # make install

配置

  1. 启用扩展

    编辑php.ini或子配置文件,Windows下文件后缀为dll
    zend_extension="/usr/local/php/modules/xdebug.so"
  2. 其他配置

    xdebug.remote_enable=1          # 启用远程调试
    xdebug.remote_connect_back=1    # 忽略 remote_host 配置, 不关注 IDE 主机地址, 服务器根据客户端发起的HTTP请求来源主机确定 IDE 主机位置
    xdebug.remote_port=9000         # 监听端口(指 IDE 的监听端口,服务器主动连接 IDE,如果端口被其他进程如php-fpm占用,一般指 PHP 环境和 IDE 在同一台机器的情况,需要更换)

    Xdebug的所有配置项可参考官方文档

修改配置后记得重启。

使用

一种方式是用外部设置的 session, 另外一种是在 phpstorm 中配置页面入口然后使用内置的监听来访问, 原理相同, 下面我们从原理开始讲解

  • IDE监听,浏览器设置Debug Session

让 phpstorm 通过监听端口的方式获取到xdebug 断点传送过来的数据。

1. 设置 `Settings>Languages&Frameworks>PHP>Debug`找到`Xdebug`配置块更改`Debug port`为服务器端配置的端口
2. 开启监听,点击PHPstorm编辑器界面右上角的电话图标至监听状态。
3. 设置断点,在需要的地方打上断点标记。
4. 设置Debug Session,debug session 的工具的目的是设置一个cookie( Key 是 `XDEBUG_SESSION`, 值是 `PHPSTORM`), 让每次发送数据的时候都会携带这个 cookie, 从而识别监听。建议安装浏览器扩展如Chrome的[Xdebug helper](https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc "Xdebug helper")。
5. 在浏览器运行页面即可在PHPstorm的断点位置看见打印的变量。
  • 另一种方式: 内部调用

这里的另外一种方式的服务器配置方式和流程完全一致, 就是第四步和第五步有所不同, 实现的原理是在phpstorm中设置运行的服务器, 然后通过 debug 模式自动设置 XDEBUG_SESSION, 并且自动开启监听。

接上面第四步:
1. 设置 `Settings>Languages&Frameworks>PHP>Servers`添加一个`Server`。
2. 点击编辑器界面右上角的配置按钮添加一个`PHP Web Application`配置,选择刚刚添加好的`Server`并设置`Start URL`。
3. 点击PHPstorm编辑器界面右上角的Debug按钮(虫子)图标,会打开一个页面并且传一个唯一的ID作为debug值,这里的数值是会变动的,页面会在断点位置停下,所以浏览器会一直转圈加载。
4. 切换到PHPstorm打开 debug 面板, 会看到相对应的监听 idekey, 这里和上一步设置的key是一致的, 同样也和 cookie 中的设置的 XDEBUG_SESSION 值一致,界面会在断点位置停下并打印出变量值。

日志跟踪调试

配置:这里只讲代码跟踪相关的配置:

cat /etc/php.d/xdebug.ini
extension=/usr/lib64/php/modules/xdebug.so 

代码跟踪日志文件位置,注意要先新建这个traces目录,并设置777

xdebug.trace_output_dir = /tmp/traces

代码跟踪日志文件格式

xdebug.trace_output_name = trace.%c.%p

trace中显示函数的参数值,这个很有用,待会细说

xdebug.collect_params = 4
xdebug.collect_includes = On
xdebug.collect_return = On
xdebug.show_mem_delta = On

使用方式

配置自动调用,脚本一开始就会自动触发记录

xdebug.auto_trace=On

或者手动调用函数触发记录,更灵活,可以在指定地方触发

<?php

xdebug_start_trace();
/* 业务代码     */
xdebug_stop_trace();

Debug 帮助面板说明

PHPstorm-Debug

  • 左侧
    绿色三角形 : Resume Program,表示將继续执行,直到下一个中断点停止。

红色方形 : Stop,表示中断当前程序调试。

  • 上方
    第一个图形示 : Step Over,跳过当前函数。

第二个图形示 : Step Into,进入当前函数內部的程序(相当于观察程序一步一步执行)。
第三个图形示 : Force Step Into,強制进入当前函数內部的程序。
第四个图形示 : Step Out,跳出当前函数內部的程式。
第五个图形示 : Run to Cursor,定位到当前光标。

  • 框架说明
    Frames : 加载的文件列表

Variables : 可以观察到所有全局变量、当前局部变量的数值
Watches : 可以新增变量,观察变量随着程序执行的变化。

标签: PHP, Debug

添加新评论