xdebug 远程调试代码 和 代码性能分析

一、XDebug 基本功能

XDebug 是一个开放源代码的 PHP Debug 工具,可以用来跟踪,调试和分析 PHP 程序的运行状况。
基本功能:

  1. 变量显示(Variable Display Features)
    xdebug 能替代 PHP 的 var_dump() 函数来显示变量值。
    xdebug 的版本包含对不同数据类型作数组元素/对象属性、最大深度和字符串长度以不同颜色标识。

  2. 堆栈跟踪(Stack Traces)
    当 xdebug 激活时,PHP 一旦要显示通知、警告或错误时,xdebug 显示堆栈跟踪信息。

  3. 函数调用栈跟踪(Function Traces)
    Xdebug 能让你把所有函数调用,包括参数和返回值以不同的格式记录到文件中。

  4. 代码覆盖率分析(Code Coverage Analysis)
    代码覆盖分析能在请求时让你知道脚本哪一行(或哪一段)在执行。

  5. 远程调试(Remote Debugging)
    Xdebug 的远程调试器允许你检查数据结构,交互式地调试代码。

  6. 脚本性能分析(Profiling PHP Scripts)
    使用 Xdebug 的内置分析分析 PHP 脚本中的瓶颈,并使用外部工具 KcacheGrind 或 WinCacheGrind 、webgrind 进行可视化。

二.、XDebug 安装

1.普通安装

这里跳过了,官网教程 https://xdebug.org/docs/install

2.Dockerfile安装

在后面加上这么一句,因为php版本是56,所以指定xdebug-2.5.5。

RUN pecl install xdebug-2.5.5 && docker-php-ext-enable xdebug

三、远程调试 Remote Debugging

1、主要配置:

官网远程调试文档 https://xdebug.org/docs/remote

配置参数选项描述
xdebug.remote_enable是否开启远程调试
xdebug.remote_host指定远程调试主机名,单人调试则是本地ip。
xdebug.remote_port指定远程调试端口号,单人调试则是本地监听的端口。
xdebug.remote_autostart是否自动开启调试。手动:POST/GET : XDEBUG_SESSION_START=客户端标识COOKIE: XDEBUG_SESSION=客户端标识
xdebug.idekey指定与 XDebug 通过 DBGp 通讯的 IDE key
xdebug.remote_connect_back忽略 xdebug.remote_host,连接 $_SERVER[‘REMOTE_ADDR’]
xdebug.remote_enable = 1
xdebug.remote_host = 192.168.2.226
xdebug.remote_port = 9001
xdebug.remote_autostart = 1
xdebug.idekey = VSCODE

2、PhpStorm 配置:

Configure Xdebug

3、vscode + docker-compose配置:

php.ini配置

[xdebug]
xdebug.remote_enable = 1 
xdebug.remote_host=192.168.2.226
xdebug.remote_port=9001
xdebug.remote_autostart = 1
xdebug.remote_log = /var/log/xdebug.log

注意:
1.docker-compose 中 ports 不要占用9001的端口。
2.xdebug.remote_host 这里使用了本地ip,如果使用 host.docker.internal 或docker.for.mac.host.internal 全局变量,确保 容器内 /etc/hosts 有对应的映射关系(18.06.1-ce不知道为啥我这不行)。
包含xdebug的lnmp一套docker地址参考

安装vscode插件php xdebug 后配置launch.json

		{
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9001,
            "pathMappings": {
                "/usr/share/nginx/wkp-master": "${workspaceRoot}",
            }
        },

pathMappings是对应的目录关系,server path / local path,一般local是当前项目打开就是${workspaceRoot}

配置完成后:
1.开启vscode绿色debug按钮,进行监听9001端口。
在这里插入图片描述
2.此时web页面进行请求,在cookie中会带有XDEBUG_SESSION标志vscode。
在这里插入图片描述
3.PHP收到带有标志的请求,按xdebug配置进行拦截。

4、远程调试工作方式:

(1)单人调试
在这里插入图片描述
(2)多人调试
在这里插入图片描述

四、PHP 脚本分析:

1、主要配置:

官网脚本分析文档 https://xdebug.org/docs/profiler

配置参数选项描述
xdebug.profiler_enable自动开启 xdebug 分析
xdebug.profiler_enable_trigger手动触发开启 xdebug 分析触发变量:XDEBUG_PROFILE (GET/POST/COOKIE)
xdebug.profiler_enable_trigger_value手动触发开启 xedebug 分析的变量值,默认值为空
xdebug.profiler_output_dir分析文件的输出目录
xdebug.profiler_output_name分析文件的文件名
xdebug.profiler_enable = 0
xdebug.profiler_enable_trigger = 1
xdebug.profiler_output_dir	= /var/log/profiler/

2、可视化工具:

平台工具名地址
LinuxKCacheGrindhttps://kcachegrind.github.io/html/Home.html
windows、Mac OSXQCacheGrindhttps://sourceforge.net/projects/qcachegrindwin/
windowsWinCacheGrindhttp://ceefour.github.io/wincachegrind/
全平台webGrindhttps://github.com/jokkedk/webgrind

3、可视化代码分析 webGrind 使用教程

超级简单,按上面的配置好php.ini,重启php,在web运行时发送http请求,加上XDEBUG_PROFILE=1,类似:

http://localhost:8080?XDEBUG_PROFILE=1

检查profiler_output_dir目录下有没有cachegrind类似的文件,运行docker镜像:

docker run --rm -v /path/to/xdebug/files:/tmp -p 80:80 jokkedk/webgrind:latest

把/path/to/xdebug/files替换成性能分析的文件,启动浏览器localhost即可。详细参阅

单个php文件可以用-d带上参数激活

php -d xdebug.profiler_enable=On xxx.php

五、Xdebug配置速查表

配置参数选项参数值类型与默认值参数选项描述
xdebug.auto_traceboolean类型,默认值=0是否在脚本运行之前自动调用相关追踪函数。
xdebug.cli_colorinteger类型,默认值=0该参数自2.2版本开始引入。如果值=1,当处于CLI模式或连接虚拟控制台时,Xdebug将高亮显示var_dumps()和堆栈输出,;在Windows中,这需要安装ANSICON工具。如果值=2,不管是否处于CLI模或连接虚拟控制台,Xdebu
xdebug.collect_assignmentsboolean类型,默认值=0该参数自2.1版本开始引入。用于控制是否为函数跟踪添加变量赋值功能。
xdebug.collect_includesboolean类型,默认值=1控制是否在跟踪文件中写入include()、include_once()、require()、require_once()等函数中用到的文件名。
xdebug.collect_paramsinteger类型,默认值=0控制在调用函数时,是否收集传递给函数的参数信息。如果参数值过大,这可能会占用大量的内存;不过,在Xdebug 2中不会出现该问题,因为Xdebug 2将相关数据写入磁盘中,而不是占用内存。如果值=0,则不显示任何信息。如果值=1,只显示类型和大小信息,例如:string(6)、array(8)。如果值=2,将显示类型和大小,以及全部信息的工具提示。如果值=3,将显示变量的全部内容。如果值=4,将显示变量的全部内容和变量名。
xdebug.collect_returnboolean类型,默认值=0控制是否在追踪文件中写入函数调用的返回值。
xdebug.collect_varsboolean类型,默认值=0控制是否收集指定作用域中的变量信息。由于需要反向工程PHP的操作码数组,因此Xdebug的分析速度可能比较慢。
xdebug.coverage_enableboolean类型,默认值=1该参数自2.2版本开始引入。控制是否允许通过设置内部结构来启用代码覆盖率功能。
xdebug.default_enableboolean类型,默认值=1当发生异常或错误时,是否默认显示堆栈信息。
xdebug.dump.*string类型,默认值=Empty这里的可以是COOKIE, FILES, GET, POST, REQUEST, SERVER, SESSION中的任意一个。用于指定发生错误时是否显示超全局变量数组中的索引变量信息。比如,你想要显示请求的IP地址和请求方式,可以设置为xdebug.dump.SERVER=REMOTE_ADD,REQUEST_METHOD多个索引变量用英文逗号隔开,如果要输出其中的所有变量,可以直接用,例如:xdebug.dump.GET=*
xdebug.dump_globalsboolean类型,默认值=1控制是否显示通过xdebug.dump.*定义的所有超全局变量的信息。
xdebug.dump_onceboolean类型,默认值=1如果出现多个错误,控制超全局变量信息是在所有错误中显示,还是只在第一个错误中显示。
xdebug.dump_undefinedboolean类型,默认值=1控制是否显示超全局变量中未定义的值。
xdebug.extended_infointeger类型,默认值=1是否强制进入PHP解析器的"extended_info"模式,这将允许Xdebug以远程调试器对文件或行添加断点。开启此模式将拖慢脚本的允许速度,该参数只能在php.ini中设置。
xdebug.file_link_formatstring类型,默认值=,自2.2版本开始引入。用于指定堆栈信息中用到的文件名称的链接样式,这允许IDE通过设置链接协议,直接点击堆栈信息中的文件名称,即可快速打开指定的文件。例如:ZendStudio://%f@%l(%f表示文件路径,%f表示行号)。
xdebug.force_display_errorsinteger类型,默认值=0自2.3版本开始引入。是否强制显示错误信息。
xdebug.force_error_reportinginteger类型,默认值=0自2.3版本开始引入。是否强制显示所有错误级别的信息。
xdebug.halt_levelinteger类型,默认值=0自2.3版本开始引入。指定出现那些错误级别的错误时,中止程序运行。例如:xdebug.halt_level=E_WARNING
xdebug.idekeystring类型,默认值=complex指定传递给DBGp调试器处理程序的IDE Key。
xdebug.manual_urlstring类型,默认值=http://www.php.net仅2.2.1以下版本可用,用于指定从函数堆栈和错误信息链接到的帮助手册的基本URL。
xdebug.max_nesting_levelinteger类型,默认值=100指定递归的嵌套层级数。
xdebug.overload_var_dumpboolean类型,默认值=1自2.2版本开始引入,当php.ini中的html_error设为1时,Xdebug是否默认使用自身的改进版本来重载var_dump()。
xdebug.profiler_appendinteger类型,默认值=0当多个请求映射到相同文件时,指定是覆盖之前的调试信息文件还是追加内容到该文件中。
xdebug.profiler_enableinteger类型,默认值=0指定是否启用Xdebug的性能分析,并创建性能信息文件。
xdebug.profiler_output_dirstring类型,默认值=/tmp指定性能分析信息文件的输出目录
xdebug.profiler_output_namestring类型,默认值=cachegrind.out.%p指定性能分析信息文件的名称
xdebug.remote_enableboolean类型,默认值=0是否开启远程调试
xdebug.remote_handlerstring类型,默认值=dbgp指定远程调试的处理协议
xdebug.remote_hoststring类型,默认值=localhost指定远程调试的主机名
xdebug.remote_logstring类型,默认值=指定远程调试的日志文件名
xdebug.remote_modestring类型,默认值=req可以设为req或jit,req表示脚本一开始运行就连接远程客户端,jit表示脚本出错时才连接远程客户端。
xdebug.remote_portinteger类型,默认值=9000指定远程调试的端口号
xdebug.trace_optionsinteger类型,默认值=0指定对于之后的请求,追踪文件是追加内容还是覆盖之前内容。
xdebug.trace_output_dirstring类型,默认值=/tmp指定追踪文件的存放目录
xdebug.trace_output_namestring类型,默认值=trace.%c指定追踪文件的名称
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值