xhprof-apm 是一款非侵入式监控平台,基于xhprof和xhgui。可以方便的查看PHP执行过程,调用次数,CPU和内存使用情况。部署简单方便,不需要修改线上代码,即可开启性能分析。
部署在开发环境可以方便调试,部署在线上服务器可以快速定位线上性能问题。
对每次请求都执行性能分析会造成服务性能有轻微的影响。但服务器CPU和内存的消耗是不可忽略的。为了减少对内存和CPU的消耗,可以通过配置控制性能分析的频率。
- PHP 7.0 +
- MongoDB 3.0.0 +
- MongoDB Extension 1.2.6 +
- 不支持CLI模式
xhprof-apm 主要由两个部分组成:
- 日志管理界面(https://github.com/longxinH/xhprof-apm/tree/master/web)
- PHP扩展(https://github.com/longxinH/xhprof-apm/tree/master/extension)
基于xhgui,slim升级到3.0,对界面进行汉化和代码调整。
基于xhprof,修复部分BUG,增加PDO预处理占位符在日志中转换为实际参数,CURL地址记录。在RINIT(Request Initialization)时候,开启日志记录,RSHUTDOWN(Request Shutdown)时候,进行性能分析提交。
git clone https://github.com/longxinH/xhprof-apm.git
cd xhprof-apm
git checkout origin/master
cd extension/
/path/to/php7/bin/phpize
./configure --with-php-config=/path/to/php7/bin/php-config
make && sudo make install
[xhprof_apm]
extension = xhprof_apm.so
xhprof_apm.config_ini = ini/apm.ini
xhprof_apm.export = php
xhprof_apm.php_file = /path/to/xhprof-apm/export.php
配置选项 | 选项 | 说明 |
---|---|---|
xhprof_apm.config_ini | 配置文件的路径(支持绝对或相对路径) | 用于控制扩展开关和选项,使用相对路径可独立控制项目 |
xhprof_apm.export | 可选php、curl | 日志提交方式 |
xhprof_apm.php_file | 脚本路径 | export = php时,在请求结束后,会将结果注册到$_apm_export变量,在此脚本中获取到日志结果,用户自行后续操作 |
xhprof_apm.curl_uri | http地址 | export = curl时,在请求结束后,会将结果提交到该地址 |
xhprof_apm.curl_timeout_ms | 毫秒级 (1s = 1000ms) | curl超时,默认值:1000ms |
<?php
var_dump($_apm_export);
curl的数据经过json_encode处理
<?php
file_put_contents('/tmp/xhprof_apm.log', file_get_contents("php://input") . PHP_EOL, FILE_APPEND);
APM_FLAGS_NO_BUILTINS (int) 使得跳过所有内置(内部)函数
APM_FLAGS_CPU (int) 使输出的性能数据中添加 CPU 数据
APM_FLAGS_MEMORY (int) 使输出的性能数据中添加内存数据
array {
["meta"] =>
array {
["url"] => 完整请求地址 (string)
["simple_url"] => 精简后的地址,保留请求参数,但不保留值,用作特定参数请求的匹配 (string)
["request_date"] => 请求时间戳 (int)
["SERVER"] => $_SERVER的值 (array)
["GET"] => $_GET的值 (array)
}
["profile"] => 性能分析 (array)
["wt"] => 执行时间 (int)
["cpu"] => CPU执行时间 (int)
["mu"] => 内存使用 (int)
["debug"] => 是否debug模式启动 (int)
}
array {
[函数名] =>
array {
["ct"] => 调用次数 (int)
["wt"] => 函数方法执行的时间耗时 (int)
["cpu"] => 函数方法执行消耗的cpu时间 (int)
["mu"] => 函数方法所使用的内存 (int)
["pmu"] => 函数方法所使用的内存峰值 (int)
}
}
可采用相对路径的形式,单独对项目控制。
配置选项 | 选项 | 说明 |
---|---|---|
apm.auto | 1、0 | 1:开启、0:关闭 |
apm.flags | APM_FLAGS_NO_BUILTINS、APM_FLAGS_CPU、APM_FLAGS_MEMORY、APM_FLAGS_FILES | 预定义变量 |
apm.ignored | array的可选选项 | 忽略性能分析中的某些函数 |
apm.rate | 0 - 100 | 频率设置,按照0到100的百分比,如果auto设为0,此选项不会生效,如设置大于100会每次开启,等于0则不开启。当不需要此选项时,请注释掉 |
apm.debug | GET参数名 | 此选项可通过特定的GET参数开启性能分析,注释即可关闭。如设置auto = 0,同时GET参数中带有设置值 (例如 http://localhost/?apm_debug) ,也会开启性能分析,优先级高于auto。 |
apm.scratch_buf | 函数长度缓冲区大小 | 默认值:512 |
apm.auto = 1
;APM_FLAGS_NO_BUILTINS
;APM_FLAGS_CPU
;APM_FLAGS_MEMORY
;APM_FLAGS_FILES
apm.flags = APM_FLAGS_CPU | APM_FLAGS_MEMORY
apm.ignored[] = md5
;0 - 100
;apm.rate = 30
apm.debug = apm_debug
apm.scratch_buf = 1024
cd xhprof-apm/web/
composer install
推荐使用MongoDB
- 安装MongoDB 官网
- MongoDB扩展 mongo-php-driver
- 启动MongoDB
- 创建索引
$ mongo
> use xhprof_apm
> db.results.createIndex({'wt' : -1})
> db.results.createIndex({'cpu' : -1})
> db.results.createIndex({'mu' : -1})
server {
listen 80;
server_name apm.com;
root /path/to/xhprof-apm/web/htdocs;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
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;
}
}