使用XHProf分析PHP性能瓶颈(一)
安装xhprof扩展
wget http://pecl.php.net/get/xhprof-0.9.4.tgz
tar zxf xhprof-0.9.4.tgz
cd xhprof-0.9.4/extension/
sudo phpize
./configure
sudo make
sudo make install
cd ../
配置php.ini
[xhprof]
extension=xhprof.so
xhprof.output_dir=/tmp
注:xhprof已经很久没有更新过了,截至目前还不支持php7,php7可以使用 https://github.com/phacility/xhprof.git。
配置xhprof环境
需要把xhprof压缩包里的两个目录复制到指定目录(假设定义到 /work/xhprof/):
mkdir /work/xhprof/
cp -a xhprof_html/ /work/xhprof/
cp -a xhprof_lib/ /work/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();
}
include_once "/work/xhprof/xhprof_lib/utils/xhprof_lib.php";
include_once "/work/xhprof/xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, 'xhprof');
});
代码解析:
$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_enable和xhprof_disable是成对出现的,一个是代码运行最前面,一个是最后面。中间是要分析的代码。
经过上面的配置后,我们后续请求项目的接口,xhprof就会分析请求过程中的CPU、内存、耗时等内容。日志保存在xhprof.output_dir目录。
配置web
配置好了,怎么查看日志呢?我们可以搭建一个简单的web server:
xhprof.test.com.conf
server {
listen 80;
server_name xhprof.test.com;
root /work/xhprof/xhprof_html;
index index.html index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
然后配置虚拟主机xhprof.test.com。重启nginx,打开 xhprof.test.com就可以看到效果了:


默认的UI里列出了:
- funciton name : 函数名
- calls: 调用次数
- Incl. Wall Time (microsec): 函数运行时间(包括子函数)
- IWall%:函数运行时间(包括子函数)占比
- Excl. Wall Time(microsec):函数运行时间(不包括子函数)
- EWall%:函数运行时间(不包括子函数)
在web中还可以看到 [View Full Callgraph] 链接,点击后可以绘制出一张可视化的性能分析图,如果点击后报错的话,可能是缺少依赖graphviz。graphviz是一个绘制图形的工具,可以更为直观的让你查看性能的瓶颈。如果需要可以安装:
yum install -y libpng
yum install -y graphviz
效果:

非侵入式引入xhprof
前面我们是通过在项目入口文件添加代码实现了分析的功能。更优雅的方式是新建一个额外的文件 xhprof.inc.php,保存在/work/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();
}
include_once "/work/xhprof/xhprof_lib/utils/xhprof_lib.php";
include_once "/work/xhprof/xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, 'xhprof');
});
利用PHP的自动加载功能,在执行代码前注入此文件,编辑php.ini:
auto_prepend_file = /work/xhprof/xhprof.inc.php
然后重启PHP服务。这样所有使用该php环境的都会生效。
或者写到指定项目的nginx配置里也行:
jifen.cc.conf
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PHP_VALUE "auto_prepend_file=/work/xhprof/xhprof.inc.php";
include fastcgi_params;
}
然后重启nginx服务。这样仅该项目生效。
通过 auto_prepend_file 和 auto_append_file包含的文件在此模式下会被解析,但有些限制,例如函数必须在被调用之前定义。
修改采样频率
默认情况下,xhprof每次都会运行,线上环境如果这么设置,会对性能有影响。
xhprof.inc.php
<?php
$profiling = !(mt_rand()%9);
if($profiling) xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
register_shutdown_function(function() use($profiling) {
if($profiling){
$xhprof_data = xhprof_disable();
if (function_exists('fastcgi_finish_request')){
fastcgi_finish_request();
}
include_once "/work/xhprof/xhprof_lib/utils/xhprof_lib.php";
include_once "/work/xhprof/xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
$xhprof_runs->save_run($xhprof_data, 'xhprof');
}
});
总结
本篇文章里,我们介绍了如何基于xhprof扩展来分析PHP性能,并记录到日志里,最后使用xhprof扩展自带的UI在web里展示出来。主要知识点:
- 安装xhprof扩展
- 在应用里注入xhprof
- 基于nginx展示分析结果
参考
1、Xhprof 的配置和使用方法 - 简书
https://www.jianshu.com/p/38e3ae81970c
2、使用XHProf查找PHP性能瓶颈 - 程序猿成长计划 - SegmentFault 思否
https://segmentfault.com/a/1190000003509917
3、PHP性能追踪及分析工具xhprof的安装与使用 - 马新才的技术博客 - SegmentFault 思否
https://segmentfault.com/a/1190000007288664
4、Tideways和xhgui打造PHP非侵入式监控平台 | 我是大熊
http://blog.it2048.cn/article-tideways-xhgui/
使用XHProf分析PHP性能瓶颈(一)的更多相关文章
- 使用XHProf分析PHP性能瓶颈(二)
上一篇文章里,我们介绍了如何基于xhprof扩展来分析PHP性能,并记录到日志里,最后使用xhprof扩展自带的UI在web里展示出来.本篇文章将讲述2个知识点: 使用xhgui代替xhprof的默认 ...
- 安装XHProf分析PHP性能瓶颈(原创)
废话不多说,直接上代码 ,手动滑稽.o(╯□╰)o 如果已解决您的问题,请在文章底部点击下关注,非常感谢. 下面是LINUX命令行 $ wget http://pecl.php.net/get/x ...
- 使用 XHProf 分析你的 PHP 程序
个人说明: 注意: php5.5运行 xhprof_enable 会发生段错误Segmentation fault: ,这是一个已知的bug. 下面是报错测试脚本: function loader( ...
- 使用XHProf查找PHP性能瓶颈
XHProf是facebook 开发的一个测试php性能的扩展,本文记录了在PHP应用中使用XHProf对PHP进行性能优化,查找性能瓶颈的方法. 一.安装Xhprof扩展 //github上下载ht ...
- 使用xhprof分析php代码性能
推荐在Linux平台使用xhprof,win下xhprof目前稳定版本在php5.5 安装xhprof 下载地址 http://pecl.php.net/get/xhprof-0.9.4.tgz 与p ...
- 使用xhprof分析php性能
今天偶然发现 xhprof可以远程分析php代码性能,大致步骤如下 1. 进入 xhprof , 点击右上角注册 并 登陆, 网站左侧解释了如何在本地安装测试xhprof, 我用的是右侧的图表模式, ...
- php:使用XHProf查找PHP性能瓶颈
https://www.cnblogs.com/casatwy/archive/2013/01/17/2865241.html XHProf是facebook 开发的一个测试php性能的扩展,本文记录 ...
- 火焰图分析openresty性能瓶颈
注:本文操作基于CentOS 系统 准备工作 用wget从https://sourceware.org/systemtap/ftp/releases/下载最新版的systemtap.tar.gz压缩包 ...
- 转:LoadRunner负载测试之Windows常见性能计数器,分析服务器性能瓶颈
发布于2012-10-8,来源:博客园 监测对象 System(系统) l %Total Processor Time 系统中所有处理器都处于繁忙状态的时间百分比,对于多处理器系统来说,该值可以反映所 ...
随机推荐
- winSocket编程(九)重叠IO
重叠模型的优点 重叠模型的基本原理 关于重叠模型的基础知识 重叠模型的实现步骤 多客户端情况的注意事项 一.重叠模型的优点 1.可以运行在支持Winsock2的所有Windows平台 ,而不像完成端口 ...
- DataGuard 配置须知
风不停,绿树荫,阳光晃眼,天真蓝,我们在奔跑,沿着斜阳,是你喘息,起伏不停... ——朴树 1.确认primary库处于归档模式 命令:archive log list; 如果没有启用归档,请先将数 ...
- 1114 Family Property
This time, you are supposed to help us collect the data for family-owned property. Given each person ...
- Yeoman安装和使用详解
Yeoman generator-react-webpack 一 什么是Yeoman Yeoman帮助我们创建项目,提供更好的工具来使我们的项目更多样化. Yeoman提供generator系统,一个 ...
- ASP.NET MVC Form表单验证与Authorize特性
一.Form表单验证 1.基本概念 表单验证是一个基于票据(ticket-based)[也称为基于令牌(token-based)]的系统.当用户登录系统以后,会得到一个包含基于用户信息的票据(tick ...
- nginx-1.12.0版本(编译安装)-自定义安装路径
nginx-1.12.0版本(编译安装)-自定义安装路径 安装路径:/application/nginx-1.12.0 1.前期准备 安装编译需要的gcc和gcc-c++ yum install -y ...
- C# 不能用于文件名的字符
在 Windows 有一些字符是不能作为文件名,尝试重命名一个文件,输入/ 就可以看到windows 提示的不能作为文件名的字符 那么具体是包括哪些符号不能作为文件名? Tilde (~) Numbe ...
- C# winfrom 写的一个搜索助手,可以按照标题和内容搜索,支持doc,xls,ppt,pdf,txt等格式的文件搜索
C# winfrom 写的一个搜索助手,可以按照标题和内容搜索,指定目录后,遍历搜索文件和子目,现在只写了支持.DOC.DOCX.XLS.XLSX.PPT.PPTX.PDF.HTML.HTM.TXT等 ...
- .NET MVC 学习笔记(六)— 数据导入
.NET MVC 学习笔记(六)—— 数据导入 在程序使用过程中,有时候需要新增大量数据,这样一条条数据去Add明显不是很友好,这时候最好就是有一个导入功能,导入所需要的数据,下面我们就一起来看一下导 ...
- UWP Button添加圆角阴影(一)
原文:UWP Button添加圆角阴影(一) 众所周知,17763之前的UWP控件,大部分是没有圆角属性的:而阴影也只有17763中的ThemeShadow可以直接在xaml中使用,之前的版本只能用D ...