• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

基于-Xdebug-生成-PHP-火焰图

php 搞代码 4年前 (2022-02-28) 23次浏览 已收录 0个评论
文章目录[隐藏]

2012 年刚开始学习 PHP,那个时候的 PHP 利用很简略,没有太多简单的设计模式,像依赖注入,工厂模式这些还简直没有,Reflection API 那时也才刚进去,一个 PHP 利用就是一些包了前端代码的脚本文件,正是因为 PHP 的简略牢靠,学习老本极低,那几年 PHP 红极一时。你能够很疾速的看懂他人写的 PHP 代码,不论他写的到底有多烂。我那个时候刚毕业凭借对 PHP 的熟练掌握能够轻松在三四线城市拿到七八千工资,加上对过后各大框架(Tp、Ci、Yii、Cphalcon)源码钻研非常透彻,自认为曾经摸到 PHP 的天花板。前面换城市写 PHP 逐步少了很多,用的比拟多的是本人基于 Swoole 写的一套框架,得心应手。

不过当初所在的公司 PHP 占据了 90% 的份额,根本都是 Laravel/Lumen 利用,这让继续在做性能优化的我变得很难。Laravel 中应用了大量的设计模式、动静注入,很多时候只有在运行时能力晓得能晓得具体的对象实例,想要仅通过看源码确定服务运行状态有肯定的难度。所以在做性能剖析时火焰图和可视化调用栈很重要,能够十分直观精确看到各种耗时。

在 PHP 中咱们能够关注两个档次的火焰图:PHP 内核PHP Zend 调用栈。前者是抓取零碎调用的耗时火焰图,后者是 Zend VM 的耗时火焰图,上面就这两种火焰图生成做分享。

运行环境

操作系统(Arch Linux)

<code class="Bash"># neofech
                   -`                    russell@T14 
                  .o+`                   ----------- 
                 `ooo/                   OS: Arch Linux x86_64 
                `+oooo:                  Host: NBLK-WAX9X M1040 
               `+oooooo:                 Kernel: 5.14.14-arch1-1 
               -+oooooo+:                Uptime: 1 hour, 15 mins 
             `/:-:++oooo+:               Packages: 852 (pacman) 
            `/++++/+++++++:              Shell: zsh 5.8 
           `/++++++++++++++:             Resolution: 1920x1080 
          `/+++ooooooooooooo/`           DE: Plasma 5.23.2 
         ./ooosssso++osssssso+`          WM: KWin 
        .oossssso-````/ossssss+`         WM Theme: Breeze 
       -osssssso.      :ssssssso.        Theme: Breeze Light [Plasma], Breeze [GTK2/3] 
      :osssssss/        osssso+++.       Icons: Uos-fulldistro-icons [Plasma], Uos-fulldi 
     /ossssssss/        +ssssooo/-       Terminal: konsole 
   `/ossssso+/:-        -:/+osssso+-     Terminal Font: Hack 10 
  `+sso+:-`                 `.-/+oso:    CPU: AMD Ryzen 5 3500U with Radeon Vega Mobile G 
 `++:.                           `-/+/   GPU: AMD ATI 03:00.0 Picasso 
 .`                                 `/   Memory: 1928MiB / 6880MiB

PHP 版本

<code class="Bash"># php -v
PHP 7.4.23 (cli) (built: Sep 19 2021 12:07:04) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Xdebug v3.1.1, Copyright (c) 2002-2021, by Derick Rethans

这个没啥要求,只有不是 5.6 版本以下就行。

Laravel 版本

<code class="Bash"># php artisan -V
Laravel Framework 8.61.0

perf 版本

<code class="Bash"># perf -v
perf version 5.14.g7d2a07b76933

下载 flamegraph

<code class="Bash">git clone https://github.com/brendangregg/FlameGraph.git
cd FlameGraph
# 这一步是将 FlameGraph 注入到可执行文件零碎门路中,上面就能够间接执行外面的工具了
export PATH=`pwd`:$PATH

这个工具是要害,通过 perf 抓取零碎调用耗时而后生成火焰图。

抓取 PHP 内核火焰图

首先找到 PHP 过程 ID,而后通过以下命令进行抓取

<code class="Bash"># 抓取 PID 为 7959 过程 60 秒
perf record -F 99 -p 7959 -g -- sleep 30

导出堆栈

<code class="Bash">perf script > out.perf

生成 Fold stacks 文件

<code class="Bash">stackcollapse-perf.pl out.perf > out.folded

生成火焰图

<code class="Bash">flamegraph.pl out.folded > php-zend-flame-graph.svg

看一下成果,svg 格局图片,能够点击火焰条进行过滤(关上新 tab 查看):

抓取 Zend VM 耗时火焰图

该火焰图生成依赖 xdebug,不同的 xdebug 版本应用的配置不一样.配置阐明能够间接看 xdebug 包配置文件或者上 Github 看。

Xdebug3 配置:

<code class="ini">zend_extension=xdebug
xdebug.mode=trace
xdebug.start_with_request=trigger
xdebug.trigger_value=StartProfileForMe
xdebug.trace_output_name = xdebug.trace.%t.%s
xdebug.output_dir = /tmp
xdebug.trace_format=1

Xdebug2 配置:

<code class="ini">xdebug.trace_output_name = xdebug.trace.%t.%s
xdebug.trace_enable_trigger = 1
xdebug.trace_output_dir = /tmp
xdebug.trace_enable_trigger_value = "<secret key>"
xdebug.trace_format=1

申请接口url,获取php堆栈数据 curl http://youdomain.com?XDEBUG_TRACE=<secret key>。trace 文件在 /tmp 目录下,以 xdebug.tarce 结尾。

转换堆栈数据(如果 stackcollapse-xdebug.php 不存在,留神下面 下载 flamegraph 介绍):

<code class="Bash">stackcollapse-xdebug.php /tmp/xdebug.trace.1635786267._data_workspaces_study_laravel-framework_laravel_server_php.xt

如果 xdebug trace 文件为 gz 格局,转换一下:

<code class="Bash"># 参数 `-dk` 示意解压并保留源文件。
gzip -dk /tmp/xdebug.trace.1635786267._data_workspaces_study_laravel-framework_laravel_server_php.xt.gz

转换堆栈数据

<code class="Bash">stackcollapse-xdebug.php xdebug.trace.1635786267._data_workspaces_study_laravel-framework_laravel_server_php.xt > out.folded

生成火焰图

<code class="Bash">flamegraph.pl out.folded > laravel-flame-graph.svg

看一下成果,svg 格局图片,能够点击火焰条进行过滤(关上新 tab 查看):


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:基于-Xdebug-生成-PHP-火焰图

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址