mirror of
https://gitee.com/ulthon/ulthon_admin.git
synced 2026-08-30 12:45:32 +08:00
feat(stack): 所有 Docker 模式集成 XHProf 性能分析
在 docker-dev/docker-dev-sync/docker-serve/full 四个模式中集成 XHProf 性能分析能力,默认不启用(--profile xhprof 按需开启),零侵入不改 业务代码和 run.sh。 核心组件: - source/docker/xhprof-bootstrap.php: 采集器初始化(auto_prepend_file) - source/docker/xhgui-config.php: XHGui 认证配置(Basic Auth)+ PDO 存储 - 各 Dockerfile: 安装 PECL xhprof 扩展 + php-profiler 到 /opt/xhprof/ - 各 docker-compose: 新增 xhgui 服务(profiles: xhprof),端口 8142 存储方案:PDO MySQL(复用现有 MySQL),避免 MongoDB PHP 驱动兼容性问题。 docker-dev/docker-dev-sync 开箱即用;docker-serve/full 需配置 XHGUI_PDO_DSN。 认证:HTTP Basic Auth,默认 admin/xhgui123,环境变量可覆盖。 采集控制:XHPROF_ENABLE 环境变量 + cookie _profiler 强制触发 + 1% 采样。 Dockerfile.base 同步新增 xhprof 扩展(框架作者需重建推送基础镜像)。
This commit is contained in:
66
source/docker/xhprof-bootstrap.php
Normal file
66
source/docker/xhprof-bootstrap.php
Normal file
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
/**
|
||||
* XHProf 性能分析采集器初始化脚本
|
||||
*
|
||||
* 通过 PHP auto_prepend_file 机制自动加载,零侵入业务代码。
|
||||
* 采集数据通过 HTTP Upload 发送到 XHGui 可视化服务。
|
||||
*
|
||||
* 环境变量控制:
|
||||
* - XHPROF_ENABLE=true 开启采集(默认关闭)
|
||||
* - XHGUI_UPLOAD_URL XHGui 上传地址(默认 http://xhgui:80/run/import)
|
||||
* - XHGUI_UPLOAD_TOKEN 上传令牌(默认 ulthon-admin-xhprof)
|
||||
*
|
||||
* Cookie 手动触发:
|
||||
* - 浏览器请求带 cookie _profiler=1 时强制采集(忽略采样率)
|
||||
*/
|
||||
|
||||
// 1. 环境变量开关检查(默认关闭)
|
||||
if (getenv('XHPROF_ENABLE') !== 'true') {
|
||||
return;
|
||||
}
|
||||
|
||||
// 2. 优雅降级:php-profiler 未安装时静默退出,不报错不影响应用
|
||||
if (!is_file('/opt/xhprof/vendor/autoload.php')) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 3. 加载 php-profiler autoloader
|
||||
require_once '/opt/xhprof/vendor/autoload.php';
|
||||
|
||||
use Xhgui\Profiler\Profiler;
|
||||
use Xhgui\Profiler\ProfilingFlags;
|
||||
|
||||
// 4. 配置 Profiler
|
||||
$config = [
|
||||
// 采集标志:CPU + 内存 + 不记录内置函数 + 不记录 span
|
||||
'profiler.flags' => [
|
||||
ProfilingFlags::CPU,
|
||||
ProfilingFlags::MEMORY,
|
||||
ProfilingFlags::NO_BUILTINS,
|
||||
ProfilingFlags::NO_SPANS,
|
||||
],
|
||||
// 数据上传方式:HTTP POST 到 XHGui
|
||||
'save.handler' => Profiler::SAVER_UPLOAD,
|
||||
'save.handler.upload' => [
|
||||
'url' => getenv('XHGUI_UPLOAD_URL') ?: 'http://xhgui:80/run/import',
|
||||
'timeout' => 3,
|
||||
'token' => getenv('XHGUI_UPLOAD_TOKEN') ?: 'ulthon-admin-xhprof',
|
||||
],
|
||||
// 采集控制:cookie 强制触发 或 1% 随机采样
|
||||
'profiler.enable' => function () {
|
||||
// 浏览器带 cookie _profiler 时强制采集(手动调试)
|
||||
if (!empty($_COOKIE['_profiler'])) {
|
||||
return true;
|
||||
}
|
||||
// 默认 1% 采样率
|
||||
return mt_rand(1, 100) === 1;
|
||||
},
|
||||
];
|
||||
|
||||
// 5. 启动采集(异常不影响应用正常运行)
|
||||
try {
|
||||
$profiler = new Profiler($config);
|
||||
$profiler->start();
|
||||
} catch (\Throwable $e) {
|
||||
error_log('[xhprof] ' . $e->getMessage());
|
||||
}
|
||||
Reference in New Issue
Block a user