前言
性能分析是衡量应用程序在代码级别的相对性能。性能分析将捕捉的事件包括:CPU的使用,内存的使用,函数的调用时长和次数,以及调用图,性能分析的行为也会影响应用性能。
在PHP的世界里,有两个截然不同的性能分析器-----主动和被动
主动 vs 被动性能分析
XDebug是一种主动分析器,在开发过程中使用,由开发人员启用。主动分析器收集的信息比被动分析器多,对性能的影响较大。通常不能应用宇生成环境中。
XHprof(本文主角)是一种被动分析器,由Facebook推出。是为了在生产环境中使用而打造的。它对应用性能的影响最小,同时可收集足够多的信息用于诊断性能问题。
PHP7编译安装xhprof扩展
# xhprof官方扩展暂不兼容php7,使用第三方
git clone https://github.com/longxinH/xhprof
cd xhprof/extension/
phpize
./configure --with-php-config=/Data/apps/php/bin/php-config
make && sudo make install
#说明
#由于每个人的环境不同,phpize命令和php-config、php.ini的路径可能不同
#这里介绍一个找文件强大的命令:locate ,具体参考(https://www.cnblogs.com/xqzt/p/5426666.html)
#编译安装完成后,编辑php.ini
locate php.ini
sudo vi ****/****/php.ini
#在php.ini文件中增加extension=xhprof.so
#重启php和nginx
#查看是否已经安装xhprof扩展
php -m | grep xhprof
#有输出则代表安装成功
xhprof实战应用
使用起来很简单,在你需要测试的代码的首尾各添加xhprof_enable()和xhprof_disable()就好了
- 模板
1 <?php
2 // cpu:XHPROF_FLAGS_CPU 内存:XHPROF_FLAGS_MEMORY
3 // 如果两个一起:XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY
4 xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
5
6 // 要测试的php代码
7
8
9 $data = xhprof_disable(); //返回运行数据
10
11 // xhprof_lib在下载的包里存在这个目录,记得将目录包含到运行的php代码中
12 include_once "xhprof_lib/utils/xhprof_lib.php";
13 include_once "xhprof_lib/utils/xhprof_runs.php";
14
15 $objXhprofRun = new XHProfRuns_Default();
16
17 // 第一个参数j是xhprof_disable()函数返回的运行信息
18 // 第二个参数是自定义的命名空间字符串(任意字符串),
19 // 返回运行ID,用这个ID查看相关的运行结果
20 $run_id = $objXhprofRun->save_run($data, "xhprof");
21 var_dump($run_id);
-
实例
web查看
nginx添加sever配置
server {
listen 80;
server_name dev.xhprof.haodf.net;
root /home/dev/xhprof/xhprof_html;
index index.php;
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
- 重启nginx
- 配置本地hosts 10.1.xx.xx dev.xhprof.haodf.net
-
浏览器输入访问 dev.xhprof.haodf.net
-
随便点一个文件访问
-
查看view Full Callgraph (如果报错的话:安装graphviz: sudo yum install graphviz 即可)
图中红色的部分为性能比较低,耗时比较长的部分,我们可以根据根据哪些函数被标记为红色对系统的代码进行优化
补充
Function Name:方法名称。
Calls:方法被调用的次数。
Calls%:方法调用次数在同级方法总数调用次数中所占的百分比。
Incl.Wall Time(microsec):方法执行花费的时间,包括子方法的执行时间。(单位:微秒)
IWall%:方法执行花费的时间百分比。
Excl. Wall Time(microsec):方法本身执行花费的时间,不包括子方法的执行时间。(单位:微秒)
EWall%:方法本身执行花费的时间百分比。
Incl. CPU(microsecs):方法执行花费的CPU时间,包括子方法的执行时间。(单位:微秒)
ICpu%:方法执行花费的CPU时间百分比。
Excl. CPU(microsec):方法本身执行花费的CPU时间,不包括子方法的执行时间。(单位:微秒)
ECPU%:方法本身执行花费的CPU时间百分比。
Incl.MemUse(bytes):方法执行占用的内存,包括子方法执行占用的内存。(单位:字节)
IMemUse%:方法执行占用的内存百分比。
Excl.MemUse(bytes):方法本身执行占用的内存,不包括子方法执行占用的内存。(单位:字节)
EMemUse%:方法本身执行占用的内存百分比。
Incl.PeakMemUse(bytes):Incl.MemUse峰值。(单位:字节)
IPeakMemUse%:Incl.MemUse峰值百分比。
Excl.PeakMemUse(bytes):Excl.MemUse峰值。单位:(字节)
EPeakMemUse%:Excl.MemUse峰值百分比。