# Stack 模式目录 本目录维护多种部署/运行模式的独立栈定义。每个模式是 `source/stack/` 下一个独立子目录。 ## 使用方式 模式目录可以直接使用,也推荐复制一份出来自定义: **直接使用**:`cd source/stack/docker-dev && docker compose up -d` **复制后自定义**(推荐): ```bash # 复制一份模板 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/` 2. `docker compose up -d`(首次会自动 build) 3. 在模式目录内执行命令:`docker compose exec php think ...` 4. 或在仓库根目录:`docker compose -f source/stack//docker-compose.yaml exec 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): ```bash 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 双写: ```bash cd source/stack/docker-dev XHPROF_ENABLE=true XHPROF_SAVER=stack XHGUI_UPLOAD_URL= 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 复用栈内 MySQL;docker-serve / full 没有内置 MySQL,需配置 `XHGUI_PDO_DSN` 指向可用的 MySQL 实例: ```env 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`)