非侵入式注入
- 全局配置
- php.ini:
auto_prepend_file、auto_append_file
- php.ini:
- 基于站点配置
- nginx:
fastcgi_param PHP_VALUE "auto_prepend_file=your_file_path";
- apache:
php_admin_value auto_prepend_file "your_file_path"
- nginx:
XHProf
XHProf是Facebook开发的轻量级的分层性能测量分析工具,其通过在程序中前后打点记录数据,从而在函数级别比较时间、内存、CPU等指标。
安装
- 依赖安装
yum install php-pecl-xhprof yum install graphviz #图表绘制插件
php.ini
中调整储存XHProf
运行数据的默认目录xhprof.output_dir="/tmp/xhprof"
web
服务器启用新主机指向xhprof_html
目录,用于图表展现服务- 函数报表
- 函数调用图
使用
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); //开始采集数据// some php logic ...$xhprofData = xhprof_disable(); //结束采集,返回数组结果include_once 'xhprof_lib/utils/xhprof_lib.php';include_once 'xhprof_lib/utils/xhprof_runs.php';$xhprofRuns = new XHProfRuns_Default();$source = 'my_source';$run = $xhprofRuns->save_run($xhprofData, $source);# 直接访问http://localhost/xhprof_html/index.php 或者如下 单次分析sprintf('http://localhost/xhprof_html/index.php?run=%s&source=%s', $run, $source);
Tideways
兼容XHProf的分层性能测量分析工具,并仍在持续更新维护中(要求PHP >= 7.0)。
安装
- 安装基础程序
git clone git@github.com:tideways/php-profiler-extension.gitphpize./configuremakesudo make install
配置
[tideways]extension=tideways.sotideways.auto_prepend_library=0 #自动注入采样库tideways.sample_rate=100 #采样频率
使用
tideways_xhprof_enable(TIDEWAYS_XHPROF_FLAGS_MEMORY | TIDEWAYS_XHPROF_FLAGS_CPU);// some php logic$data = tideways_xhprof_disable();
XHGui
基于MongoDB的XHProf数据UI接口
特性
- 支持XHProf、Tideways、Uprofiler
- 更美观的监控界面
- 支持数据存储mongo
- 百分比请求采集
- 低负载
安装
- git clone 代码汉化修复版
github.com/laynefyc/xhgui-branch
- 缓存目录cache权限777
composer install --profile --prefer-dist --optimize-autoloader
- mongo拓展
yum install php-mongodb
,并config/config.php
配置mongo连接 - web服务器启用新主机指向webroot
server { listen 80; server_name profile.doumi.com; # root directive should be global root /var/www/xhgui-branch/webroot/; index index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { try_files $uri =404; include /etc/nginx/fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }
- 目标站点注入采样库external/header.php;
- 为了避免php-fpm缓存导致其他未配置站点也被监控数据,在
external/header.php
文件头部添加if(empty($_SERVER['PHP_VALUE'])) return;
- 部分php版本时区处理有缺陷导致500错误,需要在
webroot/index.php
首行添加date_default_timezone_set('Asia/Shanghai');
- 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 } ) > db.results.ensureIndex( { 'meta.simple_url' : 1 } )
- mongo自动清理数据每5天
> use xhprof> db.results.ensureIndex( { "meta.request_ts" : 1 }, { expireAfterSeconds : 432000 } )
配置
profiler.enable
回调函数配置采样频率profile.simple_url
回调函数配置页面聚合方式