zoukankan      html  css  js  c++  java
  • Centos下给PHP7添加Xhprof性能分析

    什么是 Xhprof?
    XHProf是facebook 开发的一个测试php性能的扩展,本文记录了在PHP应用中使用XHProf对PHP进行性能优化,查找性能瓶颈的方法。

    它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情况。

    XHProf分析报告有助于理解被执行的代码的结构,它有一个简单的HTML的用户界面( PHP写成的)。

    基于浏览器的性能分析用户界面能更容易查看,或是与同行们分享成果。

    也能绘制调用关系图。

    Xhprof 与 Xdebug 区别
    Xdebug 是一个开放源代码的PHP程序调试器(即一个Debug工具)。

    对于本地开发环境来说,进行性能分析 Xdebug 是够用了。

    但如果是线上环境的话,Xdebug 消耗较大,配置也不够灵活。

    下载安装Xhprof

    直接从github下载zip压缩包,地址:https://github.com/longxinH/xhprof

    # unzip xhprof-master.zip 
    # cd xhprof-master
    # cd extension/
    # phpize
    # ./configure --with-php-config=/usr/local/php/bin/php-config --enable-xhporf
    # make && make install

     # vim /usr/local/php/etc/php.ini  //编辑php.ini,添加如下代码
    extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/xhprof.so
    # service php-fpm restart  //重启
    # php -m | grep xhprof  //命令查看是否安装xhprof扩展

    配置到项目中进行性能分析

    我在同测试项目的Linux服务器里搭建了虚拟主机,把xhprof定义了一个域名访问

    我这使用的Nginx配置的虚拟主机,域名为:http://myxhprof.com,在你们搭建完成之后,可以试着访问一下sample.php文件,这是一个小Demo,有开始和结束为止,文件中有注释。

    我所在的测试项目所用框架是tp,进入解压包目录下中的xhprof_lib目录,把utils目录拷贝到了项目目录下,我放到了Lib目录下,然后在common的公共函数文件中写入一个方法,代码如下,当然这个函数我简单的定义了一下,如果您在实际生产环境中分析的话,可以专门定义一个区分线上线上的标识~

    //common文件自定义函数
    function xhprof ()
    {
            $xhprof_data = xhprof_disable();
            include_once "/data/wwwroot/default/gaiban/Lib/utils/xhprof_lib.php";
            include_once  "/data/wwwroot/default/gaiban/Lib/utils/xhprof_runs.php";
            $xhprof_runs = new XHProfRuns_Default();
            $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");
       
            echo '开始性能分析地址:<a href="http://myxhprof.com/index.php?run='.$run_id .'&source=xhprof_foo" target="_blank">点击分析</a>';
     }
    //测试项目访问的方法
    <?php 
    class Test {
    public function index()
    {
                //-------------------------------------------------------------程序运行开始函数位置
                xhprof_enable();//---------------------------------------------程序运行开始函数位置
                //-------------------------------------------------------------程序运行开始函数位置
                $Rand_hot = $this->Rand_hot_article();        
                $Hot_list = $this->hot_acticle(5);
                $links = $this->links();
                $this->assign('links',$links);
                $this->gg = $this->gonggao_merge();
                $TagList = $this->Tags();    
                $Newlist_Page = $this->New_Article(18);
                $Newlist = $Newlist_Page['list'];
                $Page = $Newlist_Page['page'];
                //-------------------------------------------------------------程序运行结束函数位置
                xhprof();//------------这里是common自定义的函数位置--------------程序运行结束函数位置
                //-------------------------------------------------------------程序运行结束函数位置
                $this->assign('Hot_list',$Hot_list);
                $this->assign('Rand_list',$Rand_hot); 
                $this->assign('NewLIST',$Newlist);
                $this->assign('Page',$Page);
                $this->assign('TagList',$TagList);     
                 $this->display();
        }

    然后访问项目

     

     

    形象化的查看分析结果

    使用xhprof_disable完成性能分析并且获取到分析结果之后,我们通常不会直接输出结果,因为这样的结果是以数组形式组织的,看起来并不直观,幸运的是,xhprof提供了基于web的图形界面对分析结果进行查看。

    在使用之前,请先确保服务器安装了graphviz工具,否则在生成监控图表的时候回出现以下错误:

    failed to execute cmd: " dot -Tpng". stderr: `sh: dot: command not found '

    解决办法直接yum安装:

    #  yum install graphviz

    如果安装好了graphviz,仍然出现”failed to execute cmd”,检查下服务器上的php.ini中disable_functions这项是不是限制了proc_open,因为在xhprof_lib/utils/callgraph_utils.php的xhprof_generate_image_by_dot中使用了proc_open函数,或者设置“disable_functions = “ 即可,一般没有必要在php.ini中关闭函数使用,人为修炼代码技术即可。

    解决完错误,再次请求,出现下面效果图。注意到中间的[View Full Callgraph]链接,通过该链接我们可以看到图形化的分析结果。

    点击局部,可以看到大图。

    以上,大家可以看到 函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情况。

    图中红色的部分为性能比较低,耗时比较长的部分,我们可以根据根据哪些函数被标记为红色对系统的代码进行优化

  • 相关阅读:
    poj 2386 Lake Counting
    hdu 3998 Sequence
    hdu 1556 Color the ball
    synchronized和ReentrantLock的区别
    4种常用线程池
    java深浅拷贝
    ConcurrentHashMap总结
    List原理
    volatile关键字
    java关键字总结
  • 原文地址:https://www.cnblogs.com/wt645631686/p/8309677.html
Copyright © 2011-2022 走看看