当程序执行速度较慢时,除了服务器系统的状态外,mysql slow log此外,还可以分析代码的性能来定位问题。最简单和常用的方法是记录不同代码的地方的日志来分析程序中每个节点的执行时间。XHProf能有效地对php性能分析代码。
介绍
XHProf 是量级分层性能测量分析器PHP扩展。 可跟踪调用次数、运行时间、CPU 计算时间和内存费用,显示动态调用程序的路径。XHProf 提供一个基础 HTML 显示分析数据的简单用户界面也支持以图片的形式查看调用路径。
安装
Centos
1pecl install xhprof
会报以下错误:
1
2
3Failed to download pecl/xhprof within preferred state “stable”,
latest release is version 0.9.4, stability “beta”,
use “channel://pecl.php.net/xhprof-0.9.4” to install
因为 xhprof 是 beta 版本,不是 stable 用以下命令安装版本:
1pecl install channel://pecl.php.net/xhprof-0.9.4
为了以图片的形式显示,需要安装 graphviz:
1yum install graphviz # 支持图形化显示结果
在 php.ini 生成中加载扩展和配置 profile 数据存储目录:
1
2extension=xhprof.so
xhprof.output_dir=生成数据存储目录
要通过 web 需要下载形式查看分析结果xhprof将源代码(包括图形显示分析结果所需的代码及相关类库)放入 web 可访问的目录。xhprof 目录结构如下:
1
2
3
4
5
6
7
8
9
10
11
12bin
CHANGELOG
CREDITS
examples
extension
LICENSE
package.xml
README
scripts
support
xhprof_html
xhprof_lib
使用
以一个简单的代码为例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39<?php
include(realpath(dirname(__FILE__)."/vendor/autoload.php"));
// 在开始分析的地方加上 xhprof_enable() 方法
// XHPROF_FLAGS_NO_BUILTINS 表示不分析 PHP内置函数
xhprof_enable(XHPROF_FLAGS_NO_BUILTINS);
// 开始需要分析的代码
// 不用担心具体的逻辑
use Simplelog\Simplelog;
$logFile = "/tmp/simple.log";
$log = new Simplelog($logFile);
$log->debug('skimlinks', array('affid'=>'223'));
// 需要分析的代码结束了
// 结束分析
// 数组存在分析结果 $xhprof_data 里
$xhprof_data = xhprof_disable();
// 保存分析结果 php.ini 中配置的 xhprof.output_dir 目录中
// 下面的代码可以包装,这里只做简单的演示
// xhprof/xhprof_lib/ 在下载源码中 xhprof_lib,即上图标2的文件夹
include_once "xhprof/xhprof_lib/utils/xhprof_lib.php";
include_once "xhprof/xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
// "xhprof_foo" 命名空间可以自定义.
// run_id 生成的唯一id,供下面通过 url 访问查看的形式
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");
// xhprof/xhprof_html/ 在下载源码中 xhprof_html,即上图1的文件夹
// xhprof_html 须放到 web 可访问的目录
// link 地址可以查看分析结果
$link = "http://yourdomain.com/xhprof_html/index.php?run=$run_id&source=xhprof_foo";
echo "{$link}";
结果分析
通过以下地址可以查看上一步生成的分析结果:
1http://yourdomain.com/xhprof_html/index.php?run=5be28a5486b02&source=xhprof_foo
通过上述地址,可以看到类似于下面列表的显示,可以从不同维度看到各种方法的性能:执行时间,CPU占用等信息
主要参数说明1
2
3
4
5
6
7
8
9
10
11
12
13
14Calls 调用次数
Calls% 调用百分比
Incl. Wall Time 调用包括子函数的所有时间,用微秒计算
IWall% 调用的百分比包括子函数的所有时间
Excl. Wall Time 函数执行本身所花费的时间不包括子树执行时间,以微秒计算
EWall% 函数执行本身所花费的时间百分比不包括子树执行时间
Incl. CPU(microsecs) 执行方法的费用CPU时间,包括子方法的执行时间
ICPU% 执行方法的费用CPU时间百分比
Excl. CPU(microsec) 实施方法本身的费用CPU时间不包括子方法的执行时间
ECPU% 实施方法本身的费用CPU时间百分比
Incl.MemUse(bytes) 该方法占用的内存,包括子方法占用的内存。(单位:字节)
IMemUse% 该方法占用的内存百分比。
Excl.MemUse(bytes) 方法本身占用的内存不包括子方法占用的内存。(单位:字节)
EMemUse% 方法本身占用的内存百分比。
图片展示
点击上面列表显示的View Full Callgraph,您可以跳转到下图中图片显示的界面。
通过下图,我们可以看到各种方法的呼叫路径和执行时间。红色块执行时间最长,其次是黄色块。这样,您可以快速找到对性能有很大影响的节点,然后在相应的节点中分析代码或代码 mysql 问题很方便。