其实网上这类文档已经很多了,以下是亲测可执行过程,供各位参考。
一、安装
安装PHP相关的Docker环境
# redis mysql是我本地环境需要的 各位不需要安装,mongo是XHGui用到的
docker pull mongo:latest
docker pull redis:latest
docker pull webdevops/php-apache:7.2
docker pull mysql:5.7
docker run -it -d -p 6379:6379 --name redis redis:latest
docker run -it -d -p 8306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql57 -v ~/Documents/mysql57:/var/lib/mysql mysql:5.7
docker run -it -d -p 27017:27017 -v ~/Documents/code/mongodb:/data/db --name mongo mongo:latest
docker run -it -d -p 8272:80 -p 8273:443 --name php72 --link redis:redis --link mysql57:mysql57 -v ~/Documents/code:/app webdevops/php-apache:7.2
# 时区修改
docker cp /usr/share/zoneinfo/Asia/Shanghai redis:/etc/localtime
docker cp /usr/share/zoneinfo/Asia/Shanghai mysql57:/etc/localtime
docker cp /usr/share/zoneinfo/Asia/Shanghai mongo:/etc/localtime
docker cp /usr/share/zoneinfo/Asia/Shanghai php72:/etc/localtime
安装tideways扩展及Mongo扩展
进入本地环境安装包目录,请将localPath替换成自己的目录,我本地是 ~/Documents/code/evn_config
cd /localPath/
git clone https://github.com/tideways/php-xhprof-extension.git
下面开始进入容器中处理,安装tideways_xhprof扩展和mongo扩展
docker exec -it php72 bash
cd /app/evn_config/php-xhprof-extension
phpize
./configure
make && make install
echo 'extension=tideways_xhprof.so'>/usr/local/etc/php/conf.d/tideways_xhprof.ini
pecl install mongodb
echo 'extension=mongodb.so'>/usr/local/etc/php/conf.d/mongodb.ini
service php-fpm restart
安装XHGui
退出docker,将xhgui下载到本地, 我本地是 ~/Documents/code/evn_config
cd /localPath
#以下是我开始下载的xhgui,但是发现挺多bug,包括安装composer也是一路坎坷
#git clone https://github.com/perftools/xhgui.git
#下面这个是网上翻到的其他网友处理过的branch,应该不错,可惜我git下来之后composer还是挺多问题
#git clone https://github.com/laynefyc/xhgui-branch.git
#最终基于原始的xhgui,经过一翻改造以后,我维护到了自己的github上,供大家直接克隆下载
git clone https://github.com/ilover17/xhgui.git
由于本地已经有php环境了,所以我将composer.json里面的php相关依赖去掉,包括phpunti也可以去掉 (反正里面的用例也有问题)
完成后进入docker 进行下composer操作
说明:如果大家下载的是https://github.com/ilover17/xhgui.git,可以不需要再composer了,直接进入配置阶段。
当然你可以进去composer update一下
二、配置
配置之前,先说一下整个性能分析的基本数据采集和数据展示的原理:
1)数据采集:
方式1:通过php的auto_prepend_file参数,完成Tideways的非入侵式采集开启(实际上也是入侵),php脚本执行完成后自动进行disable,并将数据存入配置好的mongo数据库中。
方式2:通过Tideways提供的方法,进行数据的主动采集到某个文件中,再通过xhgui提供的导入方法,导入到mongo中
2)数据展示
访问xhgui的web地址,xhgui查询配置的mongo中的数据,并展现到ui上。
PHP配置
我的docker中是apache,所以用另外一种方案,直接进入docker后修改一下php.ini配置:
docker exec -it php72 bash
echo 'auto_prepend_file=/app/evn_config/xhgui/external/header.php'>auto_prepend.ini
XHGui 配置Mongodb
直接修改xhgui/config/config.default.php 其中mongodb的ip地址请根据本地实际情况来
'db.host' => getenv('XHGUI_MONGO_HOST') ?: 'mongodb://172.17.0.9:27017',
'db.db' => getenv('XHGUI_MONGO_DATABASE') ?: 'xhprof',
XHGui 配置生成日志的频率,采样规则
还是修改config.default.php中的配置信息
'profiler.enable' => function() {
// url 中包含debug=1则百分百捕获
// 说明,这里可以加上自定义的采样规则,可以通过$_SERVER等来判断
if(!empty($_GET['debug'])){
return True;
}else{
// 1%采样
return rand(1, 100) === 42;
}
}
mongo 配置
docker exec -it mongo bash
mongo
> use xhprof
> db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } )
> db.results.ensureIndex( { 'profile.main().wt' : -1 } )
> db.results.ensureIndex( { 'profile.main().mu' : -1 } )
> db.results.ensureIndex( { 'profile.main().cpu' : -1 } )
> db.results.ensureIndex( { 'meta.url' : 1 } )