mirror of
https://gitee.com/ulthon/ulthon_admin.git
synced 2026-08-30 12:45:32 +08:00
在 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 扩展(框架作者需重建推送基础镜像)。
67 lines
2.1 KiB
PHP
67 lines
2.1 KiB
PHP
<?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());
|
||
}
|