zoukankan      html  css  js  c++  java
  • PHP:使用xdebug profiler 做性能分析

    PHP:使用xdebug profiler 做性能分析
    转自:https://zhuanlan.zhihu.com/p/26615449
    PHP:使用xdebug profiler 做性能分析

    PHP:使用xdebug profiler 做性能分析

    CailiangCailiang
    作为PHP程序员我们或多或少都了解或使用过xdebug。我们最常用的可能就是使用它和一些IDE配合,来实现断点调试的功能。但xdebug还有很多很有用的功能,比如它可以将项目的运行流程输出到日志,并记录内存使用,执行时间等信息。还提供一些内置的方法比如我们常用的xdebug_debug_zval,打印变量结构的相关信息。还有我们今天要用到的 profiler,可以检测项目的性能,找到瓶颈所在。下面我们通过一个例子来学习profiler的用法。

    我们的测试环境是 Mac, php71, 安装也很简单:

    brew install php71; brew install homebrew/php/php71-xdebug

    通过 brew 安装的我们可以在 /usr/local/etc/php/7.1/conf.d 目录下找到xdebug扩展的配置文件,我们需要添加 profiler 的相关配置:

    xdebug.profiler_output_dir 很明显是用于存放生成的文件的路径

    xdebug.profiler_enable profiler功能的开关,默认值0,如果设为1,则每次请求都会生成一个性能报告文件。

    xdebug.profiler_enable_trigger 默认值也是0,如果设为1 则当我们的请求中包含XDEBUG_PROFILE参数时才会生成性能报告文件。例如http://localhost/index.php?XDEBUG_PROFILE=1(当然我们必须关闭xdebug.profiler_enable)。使用该功能就捕获不到页面发送的ajax请求,如果需要捕获的话我们就可以使用xdebug.profiler_enable功能。

    xdebug.profiler_output_name 生成的文件的名字,默认 cachegrind.out.%t.%p

    配置好后,我们就可以开始尝试了,比如我们基于thinkphp5写了一个测试程序,

        public function t()
        {
            $p = $this->request->param();
            $this->t1();
            $this->t2();
            $this->t3();
            $this->t1();
            $this->t1();
            return json($p);
        }
    
        public function t1()
        {
            for ($i = 0; $i < 3; $i++) {
                sleep(1);
            }
        }
    
        public function t2()
        {
            for ($i = 0; $i < 5; $i++) {
                sleep(1);
            }
        }
    
        public function t3()
        {
            for ($i = 0; $i < 8; $i++) {
                sleep(1);
            }
        }
    

    然后通过浏览器访问一下。OK,我们再去我们配置的 xdebug.profiler_output_dir 目录下面查看一下,看到有一些文件生成了。当然这些文件我们直接看可能很费劲,我们需要借助一些图形化的分析工具---qcachegrind(Mac上我们用这个,如果是Linux就用 kcachegrind) , 在Mac上我们直接用 brew install graphviz; brew install qcachegrind 安装就行。但是 作分析的时候 "Call Graph" 功能可能用不了。后来找到这篇文章How to install qcachegrind (kcachegrind) on Mac OSX Snow Leopard 有解决的办法:

    sudo ln -s /usr/local/bin/dot /usr/bin/dot

    用 qcachegrind 打开生成的文件,可以看到下面的结果:

    通过图形化的页面我们能一目了然的看到我们的程序执行的流程,和一些方法的耗时,点击到某个具体的方法可以看到更详细的信息,比如我们想要查看t方法的执行过程,我们先点击t方法,看右上方的 SourceCode,可以看到该方法的源代码,以及它调用的其它方法的耗时情况。 下方的框,我们切换到 CallGraph 可以图形化的看到,每个方法的调用次数及耗时。

    通过这个图我们一眼就能发现t方法的耗时最终都在 php的sleep方法上面。是不是有简单,又高效。qcachegrind 还有很多其它的功能,欢迎留言分享。

    还没有评论
    苑葩
    写下你的评论...






  • 相关阅读:
    CentOS8下安装mysql8
    Git使用
    《操作系统导论》读书笔记
    《Linux命令行大全》读书笔记
    Centos8 开机后显示 Activate the web console with: systemctl enable --now cockpit.socke
    numpy学习笔记
    CentOS8使用阿里源
    Python 面向对象
    matplotlib解决不显示中文问题
    MySQL基础第三课
  • 原文地址:https://www.cnblogs.com/wolfgang-/p/8074167.html
Copyright © 2011-2022 走看看