Files
ulthon_admin/source/stack

Stack 模式目录

本目录维护多种部署/运行模式的独立栈定义。每个模式是 source/stack/ 下一个独立子目录。

使用方式

模式目录可以直接使用,也推荐复制一份出来自定义:

直接使用cd source/stack/docker-dev && docker compose up -d

复制后自定义(推荐):

# 复制一份模板
cp -r source/stack/docker-dev source/stack/docker-dev-myproject

# 修改副本中的端口、服务配置等
# (如 compose 的 name、ports、volumes 等)

# 运行副本
cd source/stack/docker-dev-myproject && docker compose up -d

复制后自定义的好处:

  • 框架更新(admin:update)只更新原始模板,不覆盖你的副本
  • 可以基于同一个模板创建多个实例(如 dev / test 分开跑)
  • 端口、服务配置等自定义不污染框架原始模板

启动与命令执行

  1. cd source/stack/<mode>
  2. docker compose up -d(首次会自动 build
  3. 在模式目录内执行命令:docker compose exec <service> php think ...
  4. 或在仓库根目录:docker compose -f source/stack/<mode>/docker-compose.yaml exec <service> php think ...

可用模板

模式 说明
default 默认基线,仓库根目录 php think run,无 Docker 文件
docker-serve Docker 部署模式基于基础镜像nginx + php-fpm + XHProf
docker-dev Docker 开发模式nginx + php-fpm + MySQL + Redis + phpMyAdmin + Xdebug + XHProf
docker-dev-sync Docker 开发模式 - Windows I/O 优化rsync 同步,避免 bind mount 慢速问题) + XHProf
full 完整服务栈(规划中),从 PHP 镜像从头构建 + XHProf
author 框架作者维护工具(基础镜像构建、发布脚本等)

author 为框架作者专用,使用者一般不需要。

XHProf 性能分析(可选)

docker-dev / docker-dev-sync / docker-serve / full 模式内置了 XHProf 性能分析能力,默认不启用,完全不影响现有行为。

推荐路径:本地文件落盘 + 后台查看(默认)

采集数据以 jsonl 文件按天落盘到容器内目录,由后台导入定时任务增量读取写入数据库,最终在后台管理界面查看性能报告。无需启动任何额外服务。

请求
 └─ auto_prepend_file(xhprof-bootstrap.php)
     └─ php-profiler 采集XHPROF_ENABLE 总闸 + cookie _profiler=1 强制 + 1% 采样)
         └─ 落盘 {XHPROF_FILE_DIR}/runs-{Ymd}.jsonl默认 /var/www/html/runtime/xhprof按天分文件
             └─ 后台导入定时任务增量读取入库(读同一 XHPROF_FILE_DIR导完的整天文件自动删除
                 └─ 后台管理界面查看性能报告

启用方式(默认即为 file 落盘,无需额外 profile

cd source/stack/docker-dev
XHPROF_ENABLE=true docker compose up -d

相关环境变量:

变量 默认 说明
XHPROF_ENABLE false 采集总开关true 开启
XHPROF_SAVER file 落盘方式file文件落盘/ upload推送 XHGui/ stack双写
XHPROF_FILE_DIR jsonl 落盘目录,空时容器内 /var/www/html/runtime/xhprof;采集与导入共用此变量
XHGUI_UPLOAD_URL XHGui 上传地址,仅 upload / stack 模式使用
XHGUI_UPLOAD_TOKEN ulthon-admin-xhprof 上传令牌,仅 upload / stack 模式使用

手动触发采集

默认 1% 采样率。需要强制采集某个请求时,浏览器请求带 cookie _profiler=1

可选XHGui 独立可视化服务

XHGui 已降级为可选服务(独立 profile只负责实时可视化不参与默认采集链路。需要时以 --profile xhgui 启动,并推荐配合 stack 双写:

cd source/stack/docker-dev
XHPROF_ENABLE=true XHPROF_SAVER=stack XHGUI_UPLOAD_URL=<XHGui上传地址> docker compose --profile xhgui up -d
  • XHPROF_SAVER=stack:文件落盘与 XHGui 推送同时写SaverFactory 递归双写落盘数据不丢XHGui 实时可看
  • XHGUI_UPLOAD_URL 为空时不会推送;XHPROF_SAVER=stack 且该地址为空时bootstrap 记录警告并自动降级为 file 单写(防静默丢数据)
  • XHPROF_SAVER=upload(只推送 XHGui 不落盘)为旧行为,兼容保留,不推荐

浏览器打开 http://localhost:8142 查看Basic Auth 默认 admin / xhgui123,通过 XHGUI_AUTH_USER / XHGUI_AUTH_PASS 覆盖。

XHGui 存储使用 PDO MySQL。docker-dev / docker-dev-sync 复用栈内 MySQLdocker-serve / full 没有内置 MySQL需配置 XHGUI_PDO_DSN 指向可用的 MySQL 实例:

XHGUI_PDO_DSN=mysql:host=mysql;dbname=ulthon;charset=utf8mb4
XHGUI_PDO_USER=root
XHGUI_PDO_PASS=root

端口说明

端口 服务 说明
8142 XHGui 可选的性能分析报告界面(需 --profile xhgui

迁移说明profiles 更名,破坏性变更)

XHGui 服务的 compose profile 已由 xhprof 更名为 xhgui,采集开关与 XHGui 界面彻底解耦:

  • 旧命令 docker compose --profile xhprof up -d 不再启动 XHGui请改用 --profile xhgui
  • 现在只需 XHPROF_ENABLE=true 即可采集(默认文件落盘),无需任何 profile
  • 旧栈若依赖 upload 直推 XHGui需显式设置 XHPROF_SAVER=upload 或改用推荐的 file / stack 模式

部署注记

bootstrap 的落盘方式切换与后台导入定时任务是配套变更,须同批上线:若采集端已切换为默认 file 落盘而后台导入任务未部署,落盘文件将无人消费、持续增长。

默认行为

XHPROF_ENABLE=false(默认)时不采集,行为与未集成 XHProf 完全一致;不加 --profile xhgui 时 XHGui 服务不启动。

default 目录规则(强约束)

  • source/stack/default/ 必须与代码库默认行为一致(php think run,不依赖 Docker
  • 默认行为相关文件变更时,必须同步更新 default 目录对应文件
  • 该规则通过目录维护规范与代码评审保障,不作为运行时阻断条件

基础镜像

  • author/docker/Dockerfile.base 为基础镜像构建文件,属于作者维护范围
  • 推荐标签策略:latest + 时间戳(如 20260424120000