前言

我之前使用的是xhprof+xhgui分析线上环境的性能,然而PHP版本升级到PHP 7之后,xhprof已经不可用,于是改用tideways+xhgui,这实际上也是PHP7下开源方案的唯一选择,有兴趣的可看下参考资料[2],有详细说明。

本文主要根据参考资料[1]配置,因此会有大量重复的地方,我主要其基础上根据实际生产环境的要求多添加了以下额外配置:

  • mongodb只绑定到本地
  • xhgui开启HTTP Basic认证
  • xhguimongodb中只保留最近14天的数据

系统环境

CentOS 7.3 + nginx + mysql + php71

本文假设你的lnmp环境已经可以正常使用,并且是通过源码安装PHP,现在只是需要添加性能测试的功能。如果你不熟悉lnmp环境的配置,推荐使用https://lnmp.org/提供的一键安装包,本文的配置路径均基于该包的默认配置。

安装与配置

分成以下几个部分:

  1. mongodb
  2. tideways
  3. xhgui
  4. 应用配置

1.mongodb

安装

#yum install mongodb-server mongodb -y
#pecl install mongodb

启动mongodb服务

#mongod --bind_ip 127.0.0.1

2.tideways

项目主页:https://github.com/tideways/php-profiler-extension

安装

git clone https://github.com/tideways/php-profiler-extension.git
cd php-profiler-extension
phpize
./configure --with-php-config=`which php-config`
make
sudo make install

配置

编辑php.ini文件,添加:

extension=tideways.so
tideways.auto_prepend_library=0

重启php-fpm,执行以下命令看到tideways的输出表示有生效:

#php -m | grep tide
tideways

3.xhgui

xhgui也是一个网站,最终需要通过web访问。官方版本是英文版,已经不更新了,有很多BUG,这里推荐使用中文版:https://github.com/maxincai/xhgui

安装(假设在/home/wwwroot/目录下执行如下命令)

$ git clone https://github.com/maxincai/xhgui.git
$ cd xhgui
$ php install.php

配置

1.给数据库添加索引,非必须,但是强烈推荐:

$ 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 } )

2.nginx配置(xhgui本身没有安全机制,它捕捉的数据中有敏感数据,因此开放到外网后必须开启HTTP Basic认证

创建/usr/local/nginx/conf/vhost/xhgui.conf文件,内容如下:

server
{
listen 8888; # 根据实际情况改成自己的端口
server_name 127.0.0.1; #根据实际情况改成自己的域名
index index.html index.htm index.php;
root /home/wwwroot/xhgui/webroot/; location ~ \.php
{
auth_basic "xhgui needs authentication"; # 开启HTTP Basic认证
auth_basic_user_file htpasswd; # 密码文件
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
} location / {
try_files $uri $uri/ /index.php?$uri&$args;
} location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
} location ~ .*\.(js|css)?$ {
expires 30d;
} access_log /home/wwwlogs/xhgui.access.log;
error_log /home/wwwlogs/xhgui.error.log;
}

开启HTTP Basic认证需要生成密码文件htpasswd。假设生成一个tester用户,密码为123456,则执行以下命令:

printf “tester:$(openssl passwd -crypt 123456)\n" >> /usr/local/nginx/conf/htpasswd

生成后记得检查下文件内容,格式内容应该类似如下:

$cat /usr/local/nginx/conf/htpasswd
tester:1qe8kAN82iOyo

完成配置重启,在浏览器中进入http://127.0.0.1:8888,应该能看到界面了,只是此时还没有数据。

3.进一步优化配置

xhgui 默认是按1%采集的,可是如果是排查问题时还是希望能够100%采集会比较方便。进入xhgui源码目录,修改config/config.default.php文件,平时仍然按1%的采样率采样,防止数据增长过快,当想调试时,就在URL中添加debug=1的参数即可。

config/config.default.php中,找到profiler.enable这里,按如下修改:

'profiler.enable' => function() {
// url 中包含debug=1则百分百捕获
if(!empty($_GET['debug'])){
return true;
} else {
// 1%采样
return rand(1, 100) === 42;
}
},

如果不删除采集的数据,很快就会发现mongo数据库变得很大。因此推荐配置下mongo数据库,只保留最近14天的数据。

#mongo
> use xhprof
> db.results.ensureIndex( { "meta.request_ts" : 1 }, { expireAfterSeconds : 3600*24*14 } )

如果想手动全部删除,则执行如下命令:

$ mongo
$ use xhprof;
$ db.dropDatabase();

4.应用配置

让应用实现采集,需要修改对应的nginx配置文件,添加:

fastcgi_param TIDEWAYS_SAMPLERATE “100"; #是否采样取决于xhgui的随机数配置和这里的采样率配置,两者必须同时满足,这里简单设置成100,由xhgui去控制
fastcgi_param PHP_VALUE "auto_prepend_file=/home/wwwroot/xhgui/external/header.php";

完整的nginx示例配置文件如下:

server
{
listen 80; #根据实际情况修改
server_name test.dev; #根据实际情况修改
index index.html index.htm index.php;
root /home/wwwroot/test/web/; location ~ \.php
{
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index /index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param TIDEWAYS_SAMPLERATE "100”; # 此处为重点
fastcgi_param PHP_VALUE "auto_prepend_file=/home/wwwroot/xhgui/external/header.php”; # 此处为重点
include fastcgi_params;
} try_files $uri $uri/ @rewrite;
location @rewrite {
rewrite ^/(.*)$ /index.php?_url=/$1;
} location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
} location ~ .*\.(js|css)?$ {
expires 30d;
} access_log /home/wwwlogs/test.access.log;
error_log /home/wwwlogs/test.error.log;
}

最终成功配置并采集到数据的界面

参考

  1. PHP性能被动分析工具之xhgui加tideways的安装实践
  2. Profiling Drupal: XHprof, Uprofiler, Tideways with PHP7 on Linux and Windows
  3. nginx用户认证配置

tideways+xhgui搭建php 7的性能测试环境的更多相关文章

  1. Mac 性能测试环境搭建——理论篇

    此篇为博主原创内容,若转载请写明出处,谢谢! 前言在搭建之初,我们要思考的2个点:1.性能怎么测试?2.性能的测试环境如何搭建(该如何去做)?1.什么是性能?    个人理解为:合理的架构.低耦合.高 ...

  2. 搭建Jmeter + Grafana + InfluxDB性能测试监控环境

    背景 Jmeter原生的实时监控每半分钟收集一次数据,只能在Linux控制台查看日志输出,界面看起来不直观,图表报告只能等压测结束后才能生成.如下图为jmeter在Linux下运行的实时日志: 那么如 ...

  3. Tsung CentOS 操作系统下搭建tsung性能测试环境_Part 2

    CentOS 操作系统下搭建tsung性能测试环境_Part 2 by:授客 QQ:1033553122 --------------------接CentOS 操作系统下搭建tsung性能测试环境_ ...

  4. Tsung CentOS 操作系统下搭建tsung性能测试环境_Part 1

    CentOS 操作系统下搭建tsung性能测试环境_Part 1 by:授客 QQ:1033553122 步骤1.下载软件安装包 CentOS-6.0-x86_64-bin-DVD1.iso jdk- ...

  5. 手机自动化测试:搭建appium手机自动化测试开发环境

    手机自动化测试:搭建appium手机自动化测试开发环境   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大 ...

  6. 个人环境搭建——搭建jenkins持续构建集成环境

    ---恢复内容开始--- 搭建jenkins持续构建集成环境  要搭建jenkins持续构建集成环境,首先要安装tomcat和JDK:   第一部分,基本说明:   敏捷(Agile) 在软件工程领域 ...

  7. 在Ubuntu下搭建ASP.NET 5开发环境

    在Ubuntu下搭建ASP.NET 5开发环境 0x00 写在前面的废话 年底这段时间实在太忙了,各种事情都凑在这个时候,没时间去学习自己感兴趣的东西,所以博客也好就没写了.最近工作上有个小功能要做成 ...

  8. 搭建 AngularJS+Ionic+Cordova 开发环境并运行一个demo

    目前的手机APP有三类:原生APP,WebAPP,HybridApp:HybridApp结合了前两类APP各自的优点,越来越流行. Cordova就是一个中间件,让我们把WebAPP打包成Hybrid ...

  9. Win7搭建nginx+php+mysql开发环境以及websocket聊天实例测试

    Win7搭建nginx+php+mysql开发环境以及websocket聊天实例测试一.下载相关安装包 1.下载nginx最新版本(nginx1.3.13版之后才支持websocket协议) 下载地址 ...

随机推荐

  1. NSUserDefault

    NSUserDefault是Cocoa提供的默认应用程序状态保持接口.它提供了简化的plist文件持久化方法.通过NSUserDefault类,你可以把用户首选项保存到plist文件中.到应用程序结束 ...

  2. pymysql 模块介绍

    pymysql模块是python与mysql进行交互的一个模块. pymysql模块的安装: pymysql模块的用法: import pymysql user=input('user>> ...

  3. POJ2251-Dungeon Master

    题意:给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层的地图,相同RC坐标处是连 ...

  4. 实践作业2:黑盒测试实践——在被测系统上录制脚本 Day 5

    1.处理了学生信息管理系统运行的小细节 2.总结了katalon的使用流程如下 a.在Katalon Studio中创建一个自动化测试项目. b.创建一个测试案例,用来写入所有必要的测试步骤 c.编写 ...

  5. 天梯赛 L3-013 非常弹的球 找规律

    L3-013. 非常弹的球 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 俞勇(上海交通大学) 刚上高一的森森为了学好物理,买了一个 ...

  6. 负载均衡之nginx

    什么是负载均衡负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据[均匀]分摊到多个操作单元上执行,负载均衡的关键在于[均匀].在使用nginx负载均 ...

  7. 继webpack后又一打包神器Parcel

    前言: 在继grunt.gulp实现自动化构建之后,webpack又引领前端打包潮流,众所周知的是,vue-cli的脚手架就是基于webpack进行项目打包的.而webpack还在上升的势头的时候,又 ...

  8. Java 代码质量

    被滥用的instanceof instanceof滥用, 或者直接强转, 大都数情况可以用方法override, 而且应当避免使用isA(), isB()之类的写法; 比如sonA和sonB都继承自p ...

  9. 班级博客客户端Beta阶段发布说明

    班级博客客户端Beta阶段发布说明 NewTeam 2017/12/18 项目 博客园班级博客Android客户端 目录 发布方式和发布地址 新功能 修复的缺陷 对运行环境的要求 安装方法 已知的问题 ...

  10. MFC控件实现视频“暂停” “播放”循环

    问static有什么作用,朗朗上口,可是用起来呢 MFC"按钮"控件实现开始显示"播放",按一下之后就开始播放相关视频,并且按钮显示为"暂停" ...