PHP性能追踪及分析工具xhprof的安装与使用

PHP性能追踪及分析工具xhprof的安装与使用

对于本地开发环境来说,进行性能分析xdebug是够用了,但如果是线上环境的话,xdebug消耗较大,配置也不够灵活,因此线上环境建议使用xhprof进行PHP性能追踪及分析。

我们今天就简单介绍一下xhprof的简单安装与使用

xhprof的安装

下载xhprof,我们这里选择的是通过git clone的方式,当然你也可以从 http://pecl.php.net/package/xhprof 这里下载。

cd /usr/local/src
# 我自己汉化的版本
git clone https://github.com/maxincai/xhgui.git
# 你可以clone原版
git clone https://github.com/phacility/xhprof.git

注意:
php5.4及以上版本不能在pecl中下载,不支持。需要在github上下载hhttps://github.com/phacility/xhprof.git。
另外xhprof已经很久没有更新过了,截至目前还不支持php7,php7可以试使用https://github.com/tideways/php-profiler-extension。

安装xhporof

cd xhprof/extension
/usr/local/php5.6/bin/phpize
./configure --with-php-config=/usr/local/php5.6/bin/php-config --enable-xhprof
make
make install

最后如果出现类似的提示信息,就表示编译安装成功

stalling shared extensions:     /usr/local/php-5.6.14/lib/php/extensions/no-debug-non-zts-20131226/

修改配置文件/etc/php5.6.ini,在最后增加如下配置

[xhprof]
extension=xhprof.so
xhprof.output_dir=/data/www/xhprof/output

重启php-fpm后通过phpinfo查看,或者在命令行通过php -m | grep xhprof查看是否安装成功。

注意:
需要创建output_dir
mkdir -p /data/www/xhprof/output

xhprof的简单用法

将下载的xhprof复制到webroot目录,我这里以/data/www/project-xhprof为例

mkdir /data/www/project-xhprof
cp -R /usr/local/src/xhprof/* /data/www/project-xhprof/
cd /data/www/project-xhprof

在nginx中增加站点配置

server {listen  80;server_name xhprof.dev;root /data/www/project-xhprof;index index.php index.html;access_log /var/log/nginx/xhprof.dev.log main;error_log /var/log/nginx/xhprof.dev.log.err debug;rewrite_log on;location ~* \.php$ {include fastcgi_params;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_pass  unix:/var/run/php5.6-fpm.sock;fastcgi_index index.php;}
}

重启nginx,然后使用http://xhprof.dev/examples/sample.php,可以看到一些输出,并且提示通过访问http:///index.php?run=XXX&source=xhprof_foo查看结果。接下来访问 http://xhprof.dev/xhprof_html/ 就可以看到已经保存的结果,列出了所有函数的调用以及所消耗的时间,如图:

83766106.jpg
55899334.jpg

分析一下示例代码sample.php,关健代码:

<?php
// 开始分析
xhprof_enable();// 运行一些函数
foo();// 停止分析,得到分析数据
$xhprof_data = xhprof_disable();

$xhprof_data中记录了程序运行过程中所有的函数调用时间及CPU内存消耗,具体记录哪些指标可以通过xhprof_enable的参数控制,目前支持的参数有:

  • HPROF_FLAGS_NO_BUILTINS 跳过所有内置(内部)函数。
  • XHPROF_FLAGS_CPU 输出的性能数据中添加 CPU 数据。
  • XHPROF_FLAGS_MEMORY 输出的性能数据中添加内存数据。

之后的处理已经与xhprof扩展无关,大致是编写一个存储类XHProfRuns_Default,将$xhprof_data序列化并保存到某个目录,可以通过XHProfRuns_Default(__DIR__)将结果输出到当前目录,如果不指定则会读取php.ini配置文件中的xhprof.output_dir,仍然没有指定则会输出到/tmp

xhprof_html/index.php将记录的结果整理并可视化,默认的UI里列出了:

  • funciton name : 函数名
  • calls: 调用次数
  • Incl. Wall Time (microsec): 函数运行时间(包括子函数)
  • IWall%:函数运行时间(包括子函数)占比
  • Excl. Wall Time(microsec):函数运行时间(不包括子函数)
  • EWall%:函数运行时间(不包括子函数)

xhprof_html/index.php中还可以看到[View Full Callgraph]链接,点击后可以绘制出一张可视化的性能分析图,如果点击后报错的话,可能是缺少依赖graphviz
graphviz是一个绘制图形的工具,可以更为直观的让你查看性能的瓶颈。

wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz
cd graphviz-2.24.0
./configure
make && make install

或者直接使用yum安装

yum install -y libpng
yum install -y graphviz

这时候就可以看到类似下面的效果
6d7c32f38393251c.png

优雅的接入现有项目

通过上面的这些介绍,我们其实就已经可以将xhprof整合到任何我们已有的项目中,目前大部份的MVC框架都有唯一的入口文件,只需要在入口文件的开始处注入xhprof的代码:

<?php
//开启xhprof
xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);//在程序结束后收集数据
register_shutdown_function(function() {$xhprof_data        = xhprof_disable();//让数据收集程序在后台运行if (function_exists('fastcgi_finish_request')) {fastcgi_finish_request();}//保存xhprof数据...
});

我们不可能在我们需要分析的所有地方都加上,但是这样免不了要修改项目的源代码,其实php本身就提供了更好的注入方式,比如将上述逻辑保存为/data/www/xhprof/inject.php,然后修改php配置文件中的auto_prepend_file配置

auto_prepend_file = /data/www/xhprof/inject.php

对于 Apache 服务器,添加以下代码:

php_admin_value auto_prepend_file "/data/www/xhprof/inject.php"

对于 Nginx 服务器,在服务器配置中添加以下代码:

fastcgi_param PHP_VALUE "auto_prepend_file=/data/www/xhprof/inject.php";

这样所有的php请求文件都会自动注入/data/www/xhprof/inject.php这个文件,这样侵入性更小,并且可以实现基于站点的注入。

更漂亮的数据展示xhgui

注入代码后我们还需要实现保存xhprof数据以及展示数据的UI,现有的两个比较流行的两个轮子是 xhprof.io 和 xhgui 两个项目都差不多,但综合比较起来xhprof.io年久失修,xhgui还比较活跃,UI界面也相对比较美观,我这里就选择xhgui进行数据展示了。

安装xhgui

  • 从github中clone代码至站点目录/data/www/project-xhgui
mkdir /data/www/project-xhgui
cd /data/www/project-xhgui
git clone https://github.com/perftools/xhgui.git ./
  • 设置缓存目录的权限,允许nginx创建文件
chmod -R 777
  • 启动mongodb实例,如果mongodb如没有使用默认的端口和配置,或者有使用安全验证,刚需要修改config/config.php中的相关配置,我们这里使用的是默认配置,就不作修改了。

  • 为提高 MongoDB 的性能,你可以运行以下指令以添加索引:

$ /usr/local/mongodb/bin/mongo
> use xhprof
db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } )  
db.results.ensureIndex( { 'profile.main().wt' : -1 } )  
db.results.ensureIndex( { 'profile.main().mu' : -1 } )  
db.results.ensureIndex( { 'profile.main().cpu' : -1 } )  
db.results.ensureIndex( { 'meta.url' : 1 } )  
  • 安装mongodb的PHP扩展
wget http://pecl.php.net/get/mongodb-1.1.9.tgz
tar zxvf mongodb-1.1.9.tgz
cd mongodb-1.1.9
/usr/local/php5.6/bin/phpize
./configure --with-php-config=/usr/local/php5.6/bin/php-config
make && make install
vim /etc/php5.6.ini
# 在文件最后增加
[mongo]
extension=mongo.so# 查看是否安装成功
php -m | grep mongo# 重启php-fpm
/etc/init.d/php5.6-fpm restart
  • 运行XHGui的安装脚本。安装脚本将通过composer安装XHGui的相关依赖。
php install.php
# 如果上面的命令执行报错,则执行下面的命令
composer install
  • 配置web服务器,我们这里以nginx为例
server {listen  80;server_name xhgui.dev;root /data/www/project-xhgui/webroot;index index.php index.html;access_log /var/log/nginx/xhgui.dev.log main;error_log /var/log/nginx/xhgui.dev.log.err debug;rewrite_log on;location / {try_files $uri $uri/ /index.php?$uri&$args;}location ~* \.php$ {include fastcgi_params;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_pass  unix:/var/run/php5.6-fpm.sock;fastcgi_index index.php;}
}

配置完成后重启nginx,这时候打开http://xhgui.dev/,就可以看到类似下面的页面
523fd23090f3b42c.png

修改/etc/php5.6.ini中的auto_prepend_file配置完成xhgui的接入

auto_prepend_file = /data/www/project-xhgui/external/header.php

xhgui的具体使用

最近运行

f7fc3ff077b385f8.png

也可以按时间范围和请求的地址进行搜索
472c4754ecedcbeb.png

可以按执行时间、CPU时间、内存占用进行排序
b546a4c6d72fc05c.png

可以点击一个地址进去看这个地址的最近趋势
5c8c64a3b1352279.png

一次运行的详细

236b6e475079bc2e.png

一个函数的运行详细

b7e556b3188d867c.png

一次运行的函数调用图

9f37f000e017924c.png

一次运行的火焰图

214b8f41280bac63.png

对比多次请求

eafed5faeb4e515b.png
9007ee3a63113afb.png

添加观察函数

fce6475663ab2a49.png
7726a91434a364c4.png

参考

  • 使用xhprof进行线上PHP性能追踪及分析
  • PHP性能分析——xhprof
  • PHP 性能分析第一篇: Xhprof & Xhgui 介绍
  • PHP 性能分析第二篇: Xhgui In-Depth
  • PHP 性能分析第三篇: 性能调优实战

转载于:https://www.cnblogs.com/maxincai/p/6001459.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python后面空格报错_python中空格和table混用报错原因

python是一门严格遵守缩进的语言&#xff0c;缩进的规则代表着程序的层级关系。我们来看一段代码。class MyForm(Form):value1 StringField(value1)value2 StringField(value2)value3 StringField(value3) #这行用的是Tab缩进submit SubmitField(Submit)learn pytho…

C 语言 int 型乘法溢出问题

2019独角兽企业重金招聘Python工程师标准>>> long l; int a, b; l a*b; 因为 a*b 的结果仍然以 int 型保存, 所以即使 l 为long,仍然会有溢出,并且截去了部分数据.出现问题. 转载于:https://my.oschina.net/simon203/blog/175885

Android插件化开发基础之Java类加载器与双亲委派模型

类加载器 Java虚拟机类加载过程是把Class类文件加载到内存&#xff0c;并对Class文件中的数据进行校验、转换解析和初始化&#xff0c;最终形成可以被虚拟机直接使用的java类型的过程。 在加载阶段&#xff0c;java虚拟机需要完成以下3件事&#xff1a; a.通过一个类的全限定名…

将k8s制作成3D射击游戏,好玩到停不下来,附源码

点击上方蓝字 关注【我的小碗汤】大家好&#xff0c;我是小碗汤&#xff0c;今天演示一个项目&#xff0c;利用Unity做场景、用C#做交互逻辑&#xff0c;将k8s制作成一个3D射击游戏。正好最近在学习Unity&#xff0c;所以利用这个项目开始上手挺合适的。源码、可执行文件可以自…

Struts学习笔记_i18n

1. I18N原理 a) ResourceBundle和Locale的概念 b) 资源文件 c) native2ascii //test.javaimport java.util.Locale; import java.util.ResourceBundle;public class Test {public static void main(String[] args) {ResourceBundle res ResourceBu…

map reduce相关程序

Test_1.java /** * Hadoop网络课程模板程序* 编写者&#xff1a;James*/ import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.co…

用仿ActionScript的语法来编写html5——终篇,LegendForHtml5Programming1.0开源库件

一,LegendForHtml5Programming1.0库件是什么?它是一个javascript库&#xff0c;它模仿了ActionScript的语法&#xff0c;用于html5的开发&#xff0c;目前实现的功能相对较少&#xff0c;还不能称之为引擎&#xff0c;希望将来可以作为html5的开源引擎&#xff0c;为html5开发…

JavaJVM之ClassLoader源码分析

层次结构和类图 ClassLoader层次结构&#xff1a;UML类图&#xff1a;sun.misc.Launcher.ExtClassLoader sun.misc.Launcher.AppClassLoader 显式加载类 在代码中显式加载某个类&#xff0c;有三种方法&#xff1a;this.getClass().getClassLoader().loadClass()Class.forName(…

python打包库_Python 打包自己的库到 PYPI (可pip安装)

背景在我们安装 Python 库的时候&#xff0c;通常我们都是pip install xxx真是又酷炫又方便那么&#xff0c;当我们自己写了一些自认为不错的库&#xff0c;想要分享给大家使用(或者是想要装X时)能不能也能做到这样呢&#xff1f;环境需求已经写好能正常使用的库/方法/项目 (可…

ASP.NET Core Web API使用静态swagger.json文件

前言ASP.NET Core Web API默认集成了Swashbuckle&#xff0c;可以在运行时显示Swagger UI&#xff1a;而Swagger UI实际上是解析的动态生成的swagger.json&#xff1a;app.UseSwagger(); app.UseSwaggerUI(c > c.SwaggerEndpoint("/swagger/v1/swagger.json", &qu…

XenApp共享桌面打开文件警告与桌面文件由于Internet文件安全设置无法打开解决办法...

问题现象 1. 在使用了UPM与文件夹重定向后&#xff0c;个人的桌面路径就会变成一个UNC路径&#xff0c;这个时候如果用户登录共享桌面的话可以看到桌面与快速启动栏的文件与快捷方式&#xff0c;但是打开的时候就会遇到以下错误 这种情况是由于我们放的文件是一个网络路径所导致…

Zookeeper-Zookeeper的配置

前面两篇文章介绍了Zookeeper是什么和可以干什么&#xff0c;那么接下来我们就实际的接触一下Zookeeper这个东西&#xff0c;看看具体如何使用&#xff0c;有个大体的感受&#xff0c;后面再描述某些地方的时候也能在大脑中有具体的印象。本文只关注分布式模式的zookeeper&…

Android插件化开发之动态加载基础之ClassLoader工作机制

类加载器ClassLoader 早期使用过Eclipse等Java编写的软件的同学可能比较熟悉&#xff0c;Eclipse可以加载许多第三方的插件&#xff08;或者叫扩展&#xff09;&#xff0c;这就是动态加载。这些插件大多是一些Jar包&#xff0c;而使用插件其实就是动态加载Jar包里的Class进行…

python运行时间过长怎么优化_Python性能优化的20条建议

1.优化算法时间复杂度算法的时间复杂度对程序的执行效率影响最大&#xff0c;在Python中可以通过选择合适的数据结构来优化时间复杂度&#xff0c;如list和set查找某一个元素的时间复杂度分别是O(n)和O(1)。不同的场景有不同的优化方式&#xff0c;总得来说&#xff0c;一般有分…

周选特辑|一些超棒的开源项目!

编程导航 每周新增资源优选特辑 02编程导航 致力于推荐优质编程资源 &#x1f48e;项目开源仓库&#xff1a;https://github.com/liyupi/code-nav跪求一个 star ⭐️哈喽大家好&#xff01;我是编程导航的小编火宝。美好的一周又过去了&#xff0c;大家有没有认真学习呢&#x…

js字符串函数大全

JS自带函数concat将两个或多个字符的文本组合起来&#xff0c;返回一个新的字符串。var a "hello";var b ",world";var c a.concat(b);alert(c);//c "hello,world"indexOf返回字符串中一个子串第一处出现的索引&#xff08;从左到右搜索&…

Android插件化开发之DexClassLoader动态加载dex、jar小Demo

一、温故动态加载ClassLoader机制 如果对Android的ClassLoader加载机制不熟悉&#xff0c;猛戳Android插件化开发动态加载基础之ClassLoader工作机制 http://blog.csdn.net/u011068702/article/details/53248960 二、介绍 我们知道在Android中可以跟java一样实现动态加载jar&…