一、工具

xhprof是一款性能分析工具,在php开发中可以精确分析到每行代码每个方法所消耗的时间和性能等。

二、安装xhprof

我是在本地使用phpstudy的php7.3.4nts 集成环境,若你要是linux环境可以参考​​xhprof安装和使用方法​

下载方式你可以选择


  1. 官网下载 ​​下载​​ 选择合适你的版本
  2. ​csdn下载​
  3. 我的百度网盘 ​​下载​​ 提取码 i705


下载好后将php_xhprof.dll 文件配置在本地php安装目录\ext 里,然后修改php.ini文件

extension=php_xhprof.dll
xhprof.output_dir="D:\caoxiukang\probject\project\xhprof_log" // 日志文件的目录

此时拓展文件已经装好页面输出phpinfo() 查看

php配置 xhprof性能分析工具_执行时间

则为成功。

然后配置xhprof基础文件,下载地址​​百度网盘​​ 提取码:aydr

你也可以去官网下载 ​​xhprof​

下载后我解压到 图一配置的目录下

php配置 xhprof性能分析工具_php_02

三、调试

解压到这里就好了,然后我们在需要分析的代码里配置调试

php配置 xhprof性能分析工具_子方法_03

上图中地17 行就是我自己的代码,第19行需要配置xhprof的安装地址,也就是图2解压到的地址。

然后调用这个接口,然后在这个目录下会生成日志文件。

php配置 xhprof性能分析工具_php_04

这个就是生成的日志,日志文件名前面一部分是 xhprof运行编号,后面的getColumnGoods是代码里自己配置的名字。这样子就可以直接查看了。但是不是很直观。需要配置站点。

打开xhprof-0.9.4目录下会发现有xhprof_html 目录,这个目录就是用来将日志文件解析到浏览器上的。

php配置 xhprof性能分析工具_执行时间_05

配置的站点需要将入库文件写成index.php文件。配置好后访问如下

四、表格的方式

php配置 xhprof性能分析工具_php_06

我访问的地址是 ​​http://127.0.0.1:3000/?run=5e97f92ec9c7e&source=getColumnGoods&all=1​

run是生产的编号 source 是图三代码里设置的后缀。

下面的部分就是分析出来代码每行运行的结果。

五、图表方式 -graphviz

其实上面的表格查看方式以及很清晰了,也可以选择以图表方式查看

安装 graphviz ​​百度网盘地址​​ 提取码 e1wh 下载安装到随意地址。

下载好了然后 点击页面上的 ​​[View Full Callgraph]​

php配置 xhprof性能分析工具_php_07

排错

1.有的可会出现 ​​Xhprof graphviz Warning: proc_open() [function.proc-open]: CreateProcess failed, error code​​ 错误这时需要去php.ini里将 disable_functions 里的proc_open 方法去掉。

2.如果去掉后还有报错,那就去

​xhprof_log\xhprof-0.9.4\xhprof_lib\utils\callgraph_utils.php​​ 的 112行proc_open的方法前面加@ 方法

3.如故还报错,那可能就是graphviz的安装目录有问题,需要改一下。

$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
fwrite($pipes[0], $dot_script);
fclose($pipes[0]);

$output = stream_get_contents($pipes[1]);

$err = stream_get_contents($pipes[2]);
if (!empty($err)) {
print "failed to execute cmd: \"$cmd\". stderr: `$err'\n";
exit;
}

fclose($pipes[2]);
fclose($pipes[1]);
proc_close($process);
return $output;
}
print "failed to execute cmd \"$cmd\"";
exit();
}

将原来这块代码修改如上就可以了。

然后可以打开图表如下。

php配置 xhprof性能分析工具_php_08

啊啊啊,不敢打开看,头皮发麻,赶紧优化代码去。

六、分析

具体每个参数作用根据如下:

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峰值百分比。