采用xhprof扩展对PHP项目进行性能分析

背景

  由于我们的项目是另外一个团队的server端,给他们提供的2个接口他们偶尔反应程序调用超时,他们设置httpClient的超时时间为10s。一般情况下来说我们程序一定要保证在5s以内就要返回response给客户端了,所以我们想分析一下我们的程序到底是哪个模块或者函数调用上耗时严重. 一般我们最容易想到的方法就是在某个方法前拿到开始时间戳,然后在方法执行完以后得出结束时间戳,减去开始时间戳,得到方法运行的时间。这种”土办法”,我只能说你自己写几个小demo或者代码量很小的时候,确实能最快定位到问题所在.但是庞大的项目,成百个函数,方法调用错综复杂,你还这么查? 那恭喜你,上班不用干别的事情了,你就做这个无聊且无意义的事情吧.最主要是最后统计结果不一定准,所以用”土办法”针对大型项目是行不通的. 自然我们想到了是不是存在某种针对PHP程序函数调用链追踪的工具来帮助我们分析,能够很直观地查看到函数的调用链并且能够查看每个函数的耗时时间或者内存,cpu等情况呢?

解决方案

  Google一下还真让我找到了一个名为 xhprof的PHP扩展工具,据说是Facebook开源的.大树下面好乘凉,既然Facebook出品那应该还可以.xhprof扩展能让我们实现查看程序开始到结束的函数调用链分析,例如耗时,内存,cpu等等很清晰的展现在我们面前,这样有利于我们对程序性能调优.

1.文档信息和PECL

  xhprof文档地址
  PECL地址

2.Github地址

  github

简单使用

  一般在框架index.php入口文件开头开启追踪

1
2
3
<?php

xhprof_enable();

  在http响应给客户端之前,一般在框架的output之前统一出口加上结束追踪代码即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

// include file 具体路径根据自己项目决定
$XHPROF_ROOT = APPPATH . '../webroot';
@include_once $XHPROF_ROOT . "/xhprof/xhprof_lib/utils/xhprof_lib.php";
@include_once $XHPROF_ROOT . "/xhprof/xhprof_lib/utils/xhprof_runs.php";

// 判断要调用的class和函数是否都存在 存在才调用
if (class_exists('XHProfRuns_Default') && function_exists('xhprof_disable')) {
$xhprof_runs = new XHProfRuns_Default();
$xhprof_data = xhprof_disable();
$traceId = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");
if (is_array($response)) {
$response['trace_id'] = $traceId; // 把trace_id记录下来 等会到部署的前端html页面输出参数即可查看这个trace的调用链信息
}
}

界面展示

  把xhprof在github项目当做submoodule或者git clone到你的webroot下面,能否就行html入口目录是xhprof项目的xhprof_html下.把上面记录的trace_id替换一个地址例如: http://127.0.0.1:8090/xhprof/xhprof_html/?run={$traceId}&source=xhprof_foo&all=1
访问即可看到界面如下:

image

  参数含义参考:

image