英国弗兰明曾说过一句话:“不要等待运气降临,应该去努力掌握知识。”
1 前言
大家好,我是阿沐!你的收获便是我的喜欢,你的点赞便是对我的认可。
今天这篇文章是我在2018年博客上写的,种种原因博客已不复存在。讲这篇文章的主要原因是因为之前在公司使用过,而且得到了很好的性能调优,最重要的是发现了问题解决了问题,kpi就会高,money嗖嗖的来了,哈哈......
目前我从事于golang、lua语言开发,当然PHP是老本行并没有落下,时不时的还用PHP帮别人写写东西,所以主要文章还是以php相关为主。后期的话会开展redis、mysql、openresty+nginx、docker、lua的在nginx层的使用以及实践。
3 安装
安装前的准备工作
➜ ~ php -v
PHP 7.2.4 (cli) (built: Mar 29 2018 15:19:46) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.4, Copyright (c) 1999-2018, by Zend Technologies
PECL官方版本地址连接:
http://pecl.php.net/package/xhprof
从上图可以看出18年以前没有在更新,版本很老,19年以后开始逐渐更新。3月31日又更新一波,看来还是很给力的嘛!
Github地址:
https://github.com/longxinH/xhprof
3.1下载源码安装
cd /usr/local/var/www/mumu_test
git clone https://github.com/longxinH/xhprof.git
Cloning into 'xhprof'...
remote: Enumerating objects: 32, done.
remote: Counting objects: 100% (32/32), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 854 (delta 10), reused 18 (delta 5), pack-reused 822
Receiving objects: 100% (854/854), 1.89 MiB | 417.00 KiB/s, done.
Resolving deltas: 100% (454/454), done.
3.1.1 跟着官方文档走,检查环境
进入编译的文件夹,本机地址如下:
➜ extension git:(master) pwd
/usr/local/var/www/mumu_test/xhprof/extension
➜ extension git:(master)
编译源码前使用phpize检测下PHP环境,本机命令如下:
➜ extension git:(master) phpize
Configuring for:
PHP Api Version: 20170718
Zend Module Api No: 20170718
Zend Extension Api No: 320170718
3.1.2 编译安装
./configure
creating libtool
appending configuration tag "CXX" to libtool
configure: creating ./config.status
config.status: creating config.h
➜ extension git:(master)
make && make install
Build complete.
Don't forget to run 'make test'.
Installing shared extensions: /usr/local/Cellar/php/7.2.4/pecl/20170718/
➜ extension git:(master)
第一步生成 Makefile,下一步开始编译安装,输出扩展文件的存放位置。
4 配置xhprof环境
4.1 查询本机php.ini的配置地址
➜ extension git:(master) php --ini
Configuration File (php.ini) Path: /usr/local/etc/php/7.2
Loaded Configuration File: /usr/local/etc/php/7.2/php.ini
Scan for additional .ini files in: /usr/local/etc/php/7.2/conf.d
Additional .ini files parsed: /usr/local/etc/php/7.2/conf.d/ext-opcache.ini
查看php的扩展存放地址:
➜ extension git:(master) grep extension_dir /usr/local/etc/php/7.2/php.ini
extension_dir = "/usr/local/lib/php/pecl/20170718"
; extension_dir = "ext"
; Be sure to appropriately set the extension_dir directive.
;sqlite3.extension_dir =
从上面的结果看,xhprof的编译生成的扩展位置跟php本身的扩展位置不在同一个目录中
4.2 配置xhprof.so扩展+输出目录
➜ extension git:(master) cp /usr/local/Cellar/php/7.2.4/pecl/20170718/xhprof.so /usr/local/lib/php/pecl/20170718/
cp: /usr/local/lib/php/pecl/20170718/xhprof.so and /usr/local/Cellar/php/7.2.4/pecl/20170718/xhprof.so are identical (not copied).
复制报错,显示是复制的文件完全相同,推断出编译的时候已经在php扩展文件生成了该扩展,
那么我们配置文件尾部增加xhprof的配置:
➜ extension git:(master) vim /usr/local/etc/php/7.2/php.ini
➜ extension git:(master) grep xhprof /usr/local/etc/php/7.2/php.ini
[xhprof]
extension=xhprof.so
xhprof.output_dir=/data
重启php:
➜ extension git:(master) brew services restart php
Stopping php
... (might take a while)
==> Successfully stopped php
(label: homebrew.mxcl.php)
==> Successfully started php
(label: homebrew.mxcl.php)
4.3 检查xhprof扩展是否安装成功
➜ extension git:(master) php -m | grep xhprof
xhprof
或者:
编码实践
我们在刚刚git下载的同级目录创建一个测试test目录并创建index.php
➜ mumu_test pwd
/usr/local/var/www/mumu_test
➜ mumu_test ll
total 0
drwxr-xr-x 3 xxx xxx 96B 4 10 17:34 test
drwxr-xr-x 22 xxx xxx 704B 4 10 16:24 xhprof
➜ mumu_test ll test
total 8
-rw-r--r-- 1 xxx xxx 23B 4 10 17:13 index.php
cp -r xhprof/xhprof_html test --复制对应的扩展类到项目目录
cp -r xhprof/xhprof_lib test --复制对应的输出配置到项目目录
添加代码:
vim test/index.php
<?php
//加载xhprof所需文件
include_once "./xhprof_lib/utils/xhprof_lib.php";
include_once "./xhprof_lib/utils/xhprof_runs.php";
// 实例化redis
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
//echo "Server is running: " . $redis->ping();
$redis->set('test', 1);
$time = time();
//开始分析
xhprof_enable();
for ($i = 0; $i < 100; $i++) {
$redis->get('test');
}
$redis->delete('test');
//结束分析
$xhprof_data = xhprof_disable();
//实例化xhprof类
$xhprof_runs = new XHProfRuns_Default();
//获取当前当前页面分析结果
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");
echo sprintf('共用了%u时间,分析结果生成id为%s', time() - $time, $run_id);
配置站点访问
脚本代码我们已经写好,那么需要我们配置站点访问:
server {
listen 80;
server_name www.xhprof.com;
root /usr/local/var/www/mumu_test/test;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
访问虚拟主键www.xhprof.com
输出结果:共用了0时间,分析结果生成id为60717fee13ab3
访问本地配置的目录:http://www.xhprof.com/xhprof_html/
点击run_id展示详细性能分析信息分析:
性能分析图字段解析
- funciton name : 函数名
- calls: 调用次数
- Incl. Wall Time (microsec): 函数运行时间(包括子函数)
- IWall%:函数运行时间(包括子函数)占比
- Excl. Wall Time(microsec):函数运行时间(不包括子函数)
- EWall%:函数运行时间(不包括子函数)占比率
当使用xhprof_disable完成性能分析并且获取到分析结果之后,它只是显示一个总体的结果,但是这样的结果看起来并不够直观,不够详细,我们并不能看到到底是代码哪一个环节出了问题。xhprof也想到了这一艾丹,为我们提供了基于web的图形界面对分析结果进行查看,点击页面上[View Full Callgraph]
查看:
然后就报错误了,原因是我们未安装对应的依赖类库:
failed to execute cmd: " dot -Tpng". stderr: sh: dot: command not found
安装graphviz
本机mac:brew install graphviz
centos: yum install graphviz
关于xhprof类的调用讲解
- xhprof_enable分析数据开始(类似mysql的事务),xhprof_disable整个分析代码块结束之后,它们两个中间就是要分析的数据。
- XHProfRuns_Default存储数据的类,将收集到的结果放入指定目录。例如传了
xxx
,则会输出指定目录,否则将自动读取php.ini配置文件中的xhprof.output_dir路径,未配置则输出到临时文件夹中。 - 注意根据分析图了解redis耗时点、cpu、mysql请求查询量等等指标,对应的去优化
- 尽量不要在项目开始就引入,请求量大的情况下,会影响到我们的服务器性能,磁盘等问题;尽量针对代码块做检测
最后总结
以上整体就是对xhprof扩展的安装、配置、使用进行操作介绍;如何利用xhprof来分析php代码性能,如何存储结果集,如何展示出来。希望大家一定要动手实际操作一遍,中小型项目中未使用到的可以尝试引入。你的kpi或许在这个时候就有的写了。
小伙伴们,虽然xhprof网络上已经泛滥了,但是并不影响我们对它的进一步总结。如果有用可以来一波留言:有点意思
我是阿沐,你点的每个好看,我都认真的当成了喜欢;感谢各位小伙伴的:收藏、点赞、分享和留言,我们下期再见。
有疑问加站长微信联系(非本文作者)