0x01 环境及背景说明
- php7.4
- XDebug3
大家都说用Xhprof号,但是我手头已安装XDebug,那就先用用看(所以安装的部分大家自行找下网上教程吧,大同小异)
0x02 配置XDebug
编辑php.ini(宝塔路径:/www/server/php/74/etc/php.ini),增加以下代码块:
[xdebug]
#这里路径根据实际情况修改,我的是宝塔自动安装的,这一行已经自带,建议直接将自带的放在这里
zend_extension=/www/server/php/74/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so
#以下仅适用XDebug3
#启用哪些功能(多个功能逗号分隔),develop开发助手(更详细的var_dump),debug单步调试,trace函数跟踪,profile性能分析,详解见https://xdebug.org/docs/all_settings#mode
xdebug.mode = develop,profile
#何时运行,trigger就是在有指定参数时才执行,详解见https://xdebug.org/docs/all_settings#start_with_request
xdebug.start_with_request = trigger
# 分析文件保存目录,按需更改,详解见https://xdebug.org/docs/all_settings#output_dir
xdebug.output_dir=/var/tmp/xdebug
完成后重载配置(或者直接重启),检查有没有报错
Cannot load Xdebug - it was already loaded
这个报错是配置文件的zend_extension重复了,将原先的删掉或覆盖新增的
(非必看)在网上找教程遇到的坑
网上大多都是XDebug2的配置方法,如下:
[xdebug]
zend_extension="/www/server/php/74/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so"
# profiler功能的开关,默认值0,如果设为1,则每次请求都会生成一个性能报告文件。
# xdebug.profiler_enable=0
# 默认值是0,如果设为1 则当我们的请求中包含 XDEBUG_PROFILE 参数时才会生成性能报告文件
xdebug.profiler_enable_trigger=1
# 分析文件保存目录, 默认是 /var/tmp
xdebug.profiler_output_dir="/var/tmp/xdebug"
然后遇到了如下报错
[24-May-2022 00:02:03] NOTICE: PHP message: Xdebug: [Config] The setting 'xdebug.profiler_enable_trigger' has been renamed, see the upgrading guide at https://xdebug.org/docs/upgrade_guide#changed-xdebug.profiler_enable_trigger (See: https://xdebug.org/docs/errors#CFG-C-CHANGED)
[24-May-2022 00:02:03] NOTICE: PHP message: Xdebug: [Config] The setting 'xdebug.profiler_output_dir' has been renamed, see the upgrading guide at https://xdebug.org/docs/upgrade_guide#changed-xdebug.profiler_output_dir (See: https://xdebug.org/docs/errors#CFG-C-CHANGED)
[24-May-2022 00:03:39] NOTICE: PHP message: Xdebug: [Config] The setting 'xdebug.profiler_output_dir' has been renamed, see the upgrading guide at https://xdebug.org/docs/upgrade_guide#changed-xdebug.profiler_output_dir (See: https://xdebug.org/docs/errors#CFG-C-CHANGED)
这个问题是因为“Xdebug 3 删除并更改了很多配置设置”(官网机翻),我根据提示找到了官网,参考说明将该段配置改为最上边的配置
0x02 运行XDebug
在xdebug.start_with_request = trigger
的情况下,$_ENV
(环境变量)、$_GET
或$_POST
、$_COOKIE
中带有XDEBUG_TRIGGER
均可触发,例如我要调试:
https://www.linsir.cc/index.php
只需要将地址改为:
https://www.linsir.cc/index.php?XDEBUG_PROFILE
即可触发函数,然后按照在你设置的输出文件夹(xdebug.profiler_output_dir
)下找到输出物(例如我的是cachegrind.out.598660
)
0x03 解析分析报告
选用分析软件
首先上场的是WinCacheGrind,打开后报错Cannot find call target
,经查WinCacheGrind仅适用于XDebug 2,目前不再维护,项目推荐了QCacheGrind,当然如果你还在用2的话,可以看看这篇教程。
另外,网友还推荐了phpstrom的Profiling with Xdebug,当然,这货太大了,在不用ta的情况下只为了debug安装多少有点不值
开始分析
QCacheGrind左上角打开输出物(文件类型改为全选后可选输出物),即可看到结果
左侧栏目含义如下(推测):
Incl.:表示此函数整体花费的时间,包含此函数调用的其他函数,单位是百分比。
Self:表示此函数自己花费的时间,不包含此函数调用的其他函数。
Called:表示此函数被调用的次数