php的xhprof(层次试性能分析器)扩展安装和使用

摘要:php的xhprof(层次试性能分析器)扩展安装和配置。我的环境是php7.3.2版本的,官网的扩展已经不支持使用了,我直接从GitHub上下载的扩展安装。

xhprof官方文档:http://www.php.net/manual/zh/book.xhprof.php,xhprof扩展下载地址:http://pecl.php.net/package/xhprof,官方的包最后一次更新是在13年9月30日,已经不支持php7了,这次安装的这台服务器的php是7.3.2版本,经过网上查找资料我们直接从GitHub:https://github.com/longxinH/xhprof上下载一个支持php7的包。我本地服务器的php是5.6版本的,所以直接用官网的xhprof扩展包就行了,两个包不一样,但是安装方式都是一样的。

安装和配置xhprof扩展

下载

[root@host download]# git clone https://github.com/longxinH/xhprof

生成编译文件

[root@host download]# cd xhprof/extension/
[root@host extension]# /usr/local/php/bin/phpize

编译 && 安装

[root@host extension]# ./configure --with-php-config=/usr/local/php/bin/php-config
[root@host extension]# make 
[root@host extension]# make install
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20180731/

在php.ini中添加xhprof扩展

[root@host extension]# vim /usr/local/php/etc/php.ini
.
.
.
[xhprof]
extension=xhprof.so
xhprof.output_dir=/var/local/xhprof/
.
.
.

其中 xhprof.output_dir 是 xhprof 的输出目录,每次执行 xhprof 的 save_run 方法时都会生成一个 run_id.project_name.xhprof 文件。这个目录在哪里并不重要。注意此路径的权限要可读写,否则文件无法生成成功!

然后重新启动php,到这里如果没有什么问题,打开 phpinfo 或者 在php -m 查看下扩展列表,xhprof 扩展已经安装好,接下来配置和使用xhprof。

xhprof的使用

由于 xhprof 包含了一个基于 HTML 的简单用户界面(由 PHP 写成)。 基于浏览器的用户界面使得浏览、分享性能数据结果更加简单方便。 同时也支持查看调用图。所以我们必须将 xhprof 放在php项目环境中运行。

复制xhprof_html和xhprof_lib到项目目录

[root@host xhprof]# cp -r xhprof_html /usr/local/nginx/html/
[root@host xhprof]# cp -r xhprof_lib/ /usr/local/nginx/html/

因为待会我们要访问..xhprof/index.php文件查看分析后的结果,所以直接将 xhprof_html 和 xhprof_lib 文件放在了项目目录下。

新建head.php

<?php
if(extension_loaded('xhprof')){
    // 载入刚复制过来xhprof_lib中的两个文件
	include_once '/usr/local/nginx/html/xhprof_lib/utils/xhprof_lib.php';
	include_once '/usr/local/nginx/html/xhprof_lib/utils/xhprof_runs.php';
    // 启动xhprof
    xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}

新建foot.php

<?php
if(extension_loaded('xhprof')){
    $ns = 'myXhprof';
    // 关闭profiler
    $xhprofData = xhprof_disable();
    // 实例化类
    $xhprofRuns = new XHProfRuns_Default();
    $runId = $xhprofRuns->save_run($xhprofData, $ns);
    // 前端展示库的URL
    $url = 'http://xx.xxx.xxx.xxx/xhprof_html/index.php';
    $url .= '?run=%s&source=%s';
    // 变量替换
    $url = sprintf($url, $runId, $ns);
    // 输入URL
    echo '<a href="'.$url.'" target="_blank">查看结果</a>';
}

新建test.php测试文件引入开头和结束文件

<?php
include_once 'head.php';
echo 'Hello World';
include_once 'foot.php';

   访问test.php文件,点击“查看结果”,可以看到本次请求所使用到的所有函数的列表,每个函数所耗费的时间、CPU、Memory等信息,点击第一栏可以根据所选排序。点击[View Full Callgraph]可以看到由本列表所生成的流程图,从入口到哪个函数,又到哪个函数,这个函数调用了哪个函数,这个函数调用了多少次Memcache等,一幕了然。减少MC的调用,减少这个,减少那个,请求的响应速度能不快吗?

点击[View Full Callgraph]链接时产生报错:failed to execute cmd: " dot -Tpng". stderr: `sh: dot: command not found '这是因为没有安装图形化工具,我是centos系统,安装graphviz,这样每次都会生成一个分析图。

[root@host html]# yum install graphviz

返回查看之前 /var/local/xhprof/ 目录下,每一次的分析的结果都会生成一个 .xhprof文件,文件的内容就是每次的分析结果,时间久了这个文件会越来越大,定时清理就好。

[root@host xhprof]# ll
total 12
-rw-r--r-- 1 www www 318 Feb 24 20:36 5c7346a7a1fca.myXhprof.xhprof
-rw-r--r-- 1 www www 318 Feb 24 20:38 5c734711c147d.myXhprof.xhprof
-rw-r--r-- 1 www www 318 Feb 24 20:38 5c7347126bd74.myXhprof.xhprof

假如我有1000个文件难道我都要引入这个 head.php 和 foot.php 吗?不用,我们只需要在 php.ini 中加入,但是不建议这样做,这样所有的文件都会引入这个 head.php 和 foot.php 文件,有时候我们可能只需要测试某部分的性能而不是所有的。

auto_prepend_file = /usr/local/nginx/html/head.php
auto_append_file = /usr/local/nginx/html/foot.php

或者在 .htaccess 中添加

php_value auto_prepend_file = /usr/local/nginx/html/head.php
php_value auto_append_file = /usr/local/nginx/html/foot.php

这里顺便给大家介绍一个xhprof gui , 一个xhprof的一个ui展现。使xhprof页面更漂亮,功能更强大。源码地址:https://github.com/preinheimer/xhprof,它的基本流程是将每一次分析结果存入数据库中,然后对每次的分析结果都做了更好的ui展示,使用起来更加的方便。

结束语:感谢您对本网站文章的浏览,欢迎您的分享和转载,但转载请说明文章出处。
Top