这是篇纯文档,若是之后有须要能够随时查找, 使用 xhprof 进行分析, 方便代码测试、对比分析(支持php7).php
docker run -it -p 80:80 -v /Users/xxx/Desktop/xhprof:/data phalcon /bin/bash
复制代码
支持php7的xhprof还挺多的, 咱们这里使用 github.com/longxinH/xh… 这个项目。html
git clone https://github.com/longxinH/xhprof.git 复制代码
cd xhprof/extension/ /usr/server/php7/bin/phpize ./configure --with-php-config=/usr/server/php7/bin/php-config make && make install 复制代码
执行完最后,咱们须要将此 so 文件引入到php.ini配置下git
查看 php.ini 文件路径github
/usr/server/php7/bin/php --ini Configuration File (php.ini) Path: /usr/server/php7/etc Loaded Configuration File: /usr/server/php7/etc/php.ini Scan for additional .ini files in: /usr/server/php7/etc/php Additional .ini files parsed: (none) 复制代码
编辑 /usr/server/php7/etc/php.iniweb
[Xhprof]
extension=xhprof.so
xhprof.output_dir=/data/logs
复制代码
重启 php-fpm 便可。docker
搭建案例过程略bash
咱们在要监控的逻辑前面嵌入下面代码markdown
\xhprof_enable(); ...... $order = new OrderAdepter(); $result = $order->getUserOrderByOrderNo(123); ...... $xhprof_data = \xhprof_disable(); print_r($xhprof_data); 复制代码
output:php7
咱们发现调用了xhprof拓展中的两个函数, 输出值含义composer
ct 表示 当前这个函数调用的次数,此案例都是1次
wt 表示 函数执行时间的耗时,单位为微秒
复制代码
看到这里发现, 咱们获取的信息并非不少, 好比咱们常常还要关心占用的内存、cpu等指标.
\xhprof_enable(
XHPROF_FLAGS_MEMORY
+XHPROF_FLAGS_CPU
+XHPROF_FLAGS_NO_BUILTINS
);
复制代码
output:
XHPROF_FLAGS_MEMORY 统计内存占用
XHPROF_FLAGS_CPU 统计cpu占用
XHPROF_FLAGS_NO_BUILTINS 不统计内置函数, 这次输出能够看到已经忽略了咱们拓展中的函数
咱们发现统计内存占用的字段, 有两个输出 mu 和 pmu , mu 表示使用的内存(bytes), pmu 表示使用的内存峰值(bytes)
固然,咱们仍是更但愿图表的形式能够更直观的观察性能瓶颈, 下面咱们看下怎么使用.
在咱们下载 xhprof 源码时候,目录中已经包含了
\xhprof_enable(XHPROF_FLAGS_MEMORY + XHPROF_FLAGS_CPU+XHPROF_FLAGS_NO_BUILTINS); ...... $order = new OrderAdepter(); $result = $order->getUserOrderByOrderNo(123); ...... $xhprof_data = \xhprof_disable(); include_once '/data/xhprof-master/xhprof_lib/utils/xhprof_lib.php'; include_once '/data/xhprof-master/xhprof_lib/utils/xhprof_runs.php'; $xhprof_runs = new \XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, 'your_project'); echo $run_id; //output 5cbf25e21fe9b 复制代码
执行打印出来一个字符串, 这个咱们能够理解为文件标识符. 咱们发现执行了 save_run 方法,那保存到哪里了呢.
您还记得咱们在引入 xhprof.so 拓展时候的另外一个配置吗?
没错, 在 xhprof.output_dir 配置的路径下(须要本身手动建立下目录)
感兴趣能够打开看看, 里面存了咱们分析的一些序列化对象信息.
咱们指向咱们xhprof项目中的 xhprof_html 目录
相信你到此明白了 咱们的 run_id 和 save_run中的project 的做用了
咱们最上面部分是请求的接口指标总览, 下面是具体的每一个调用函数的执行状况。
字段名 | 含义 |
---|---|
Calls | 调用次数 |
Incl. Wall Time | 调用的包括子函数全部花费时间,以微秒算 |
Excl. Wall Time | 函数执行自己花费的时间,不包括子树执行时间,以微秒算 |
Incl. CPU | 调用的包括子函数全部花费的cpu时间 |
Excl. CPU | 函数执行自己花费的cpu时间,不包括子树执行时间,以微秒算 |
Incl.MemUse | 包括子函数执行使用的内存, 以字节算 |
Excl.MemUse | 函数执行自己内存,以字节算 |
Incl.PeakMemUse | Incl.MemUse的峰值 |
Excl.PeakMemUse | Excl.MemUse的峰值 |
其他后面的 % 结尾均为对应的占比
若是查看调用流程须要安装 graphviz 图形库. 这里咱们推荐手动安装 graphviz 2.24.0 这个版本(亲自踩坑,2.40不支持)
yum -y install libtool-ltdl-devel cd /data/graphviz-2.24.0 ./configure make make install 复制代码
红色部分和黄色部分重点关心下,若是感受只想分析某个流程, 能够点击到某个方法里面再点击【View Full Callgraph】查看图表
咱们在上面使用xhprof的时候发现了强依赖, 在代码中引入了 xhprof 安装包里的几个类.
include_once '/data/xhprof-master/xhprof_lib/utils/xhprof_lib.php'; include_once '/data/xhprof-master/xhprof_lib/utils/xhprof_runs.php'; 复制代码
这里咱们可使用composer包引用来实现相同功能, 这里推荐引入 pbweb/xhprof 包。
但愿你们工做开心
更多精彩关注公众号【呆呆熊一点通】