一、工具
xhprof是一款性能分析工具,在php开发中可以精确分析到每行代码每个方法所消耗的时间和性能等。
二、安装xhprof
我是在本地使用phpstudy的php7.3.4nts 集成环境,若你要是linux环境可以参考xhprof安装和使用方法
下载方式你可以选择
下载好后将php_xhprof.dll 文件配置在本地php安装目录\ext 里,然后修改php.ini文件
extension=php_xhprof.dll
xhprof.output_dir="D:\caoxiukang\probject\project\xhprof_log" // 日志文件的目录
此时拓展文件已经装好页面输出phpinfo() 查看
则为成功。
然后配置xhprof基础文件,下载地址百度网盘 提取码:aydr
你也可以去官网下载 xhprof
下载后我解压到 图一配置的目录下
三、调试
解压到这里就好了,然后我们在需要分析的代码里配置调试
上图中地17 行就是我自己的代码,第19行需要配置xhprof的安装地址,也就是图2解压到的地址。
然后调用这个接口,然后在这个目录下会生成日志文件。
这个就是生成的日志,日志文件名前面一部分是 xhprof运行编号,后面的getColumnGoods是代码里自己配置的名字。这样子就可以直接查看了。但是不是很直观。需要配置站点。
打开xhprof-0.9.4目录下会发现有xhprof_html 目录,这个目录就是用来将日志文件解析到浏览器上的。
配置的站点需要将入库文件写成index.php文件。配置好后访问如下
四、表格的方式
我访问的地址是 http://127.0.0.1:3000/?run=5e97f92ec9c7e&source=getColumnGoods&all=1
run是生产的编号 source 是图三代码里设置的后缀。
下面的部分就是分析出来代码每行运行的结果。
五、图表方式 -graphviz
其实上面的表格查看方式以及很清晰了,也可以选择以图表方式查看
安装 graphviz 百度网盘地址 提取码 e1wh 下载安装到随意地址。
下载好了然后 点击页面上的 [View Full Callgraph]
排错:
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();
}
将原来这块代码修改如上就可以了。
然后可以打开图表如下。
啊啊啊,不敢打开看,头皮发麻,赶紧优化代码去。
六、分析
具体每个参数作用根据如下:
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峰值百分比。