自从线上接口报内存溢出的问题后,就一直想搭建一个性能分析的平台,但后来一直没有时间,知道后来出现了接口调用时间过长,才将这个任务提上议程。
我同事先前所在的部门使用了xhprof
+ xhgui
的处理方式,但是研究后发现 xhprof
只支持到php5.6,无奈放弃了,同时,虽然 tideways
自己也提供了UI,但是炫酷的都是要收费的,综合考虑后,选用了 tideways
+ xhgui
的解决方案
安装Tideways
安装PHP及扩展
在https://webtatic.com/
有每个版本的php的源,这里就简单过一下
1 | yum install epel-release |
安装Tideways
我这里存放源码的目录是 /data/local/
下,目录是不会产生任何影响的,phpize编译完扩展后会自动拷贝到php的modules对应的目录的, 拷贝命令请去除注释
1 | git clone https://github.com/tideways/php-xhprof-extension.git // 克隆下git文件 |
安装xhgui
这个项目放到一个web可访问的路径,这个最终是通过浏览器展示的
1 | git clone https://github.com/laynefyc/xhgui-branch.git // 汉化版 |
安装MongoDB
安装MongoDB
创建 /etc/yum.repos.d/mongo.repo
文件, 内容如下
1 | [mongodb-org-4.0] |
使用yum安装
1 | yum install -y mongodb-org |
启动
1 | service mongod start |
添加索引
tideways会将结果集存放在MongoDB中,当然是可以选择的,权衡一下,我们这里使用MongoDB
1 | mongo |
整合Tideways和Xhgui到项目
整合代码
汉化版xhgui的作者是建议如下使用
1 | server { |
这里是你的需要做性能监控的web服务的nginx的配置
但是,我在这样使用的时候,php-fpm在我调用的接口的时候就会自动挂掉,然后看了一下文件 xhgui/external/header.php
, 在这个里面,作者注册了register_shutdown_function
函数,我使用的框架是Yii2,其次,里面还会做判断各种扩展及存储方案,这个对于我已经确定了方案的用户来说,这种判断是没用的,相对还要消耗性能,所以这里根据header.php的逻辑,直接写入代码
在beforeAction中加入
1 | private function startXhprof() |
在 afterAction
中获取分析数据并存入MongoDB
1 | private function stopXhprof() |
整理nginx
我们需要添加一个server,指向xhgui/webroot/
目录,用于展示
1 | server { |
到此为止,访问配置的域名就可以看到性能分析平台了
异常
有可能你会遇到如下的问题
修改 /path/to/xhgui/src/Xhgui/Profiles.php
的aggregate 的传参,约172行
1 | 137 $results = $this->_collection->aggregate(array( |