TP8 创建成功。现在安装 think-swoole 扩展------这次用的是 phpswoole/swoole 镜像,自带了 swoole 扩展,不会再报错。
think-swoole 安装成功。现在查看一下项目结构,开始写 docker-compose.yml 和配置文件。
关于你为什么问到 "为什么会使用git" ------ 刚才我检查镜像时跑了 which git,是因为 Composer 在某些情况下(安装 dev
包、加载源码仓库等)会依赖 Git。不过这里只是顺带检查一下,实际上这次安装全程没用到 Git。
● 全部完成。最终项目结构如下:
D:\code\swoole\
├── docker-compose.yml # 服务编排:swoole + mysql + redis
└── tp8/ # ThinkPHP 8 项目
├── .env # 数据库、环境配置
├── config/
│ ├── swoole.php # Swoole 服务配置(已改 Redis 地址)
│ ├── database.php
│ └── ...
├── app/
├── vendor/ # 已包含 topthink/think-swoole
└── think # TP 命令行入口
常用命令
启动
cd /d/code/swoole && docker compose up -d
停止
cd /d/code/swoole && docker compose down
查看日志
docker logs tp8-swoole
进入容器
docker exec -it tp8-swoole bash
运行 TP 命令
docker exec tp8-swoole php think list
关于路径问题
在 Windows Git Bash 下,Docker 挂载路径需要用 MSYS_NO_PATHCONV=1 前缀防止路径被转换:
MSYS_NO_PATHCONV=1 docker run -v /d/code/swoole:/app ...

至此,swoole可用了。接下来需要做些测试。swoole的一些基本功能。比如 redis, queen ,job,event 等,

关于swoole的后续的使用方法,可以用几个小的案例。敬请期待。
TP8 + Swoole 项目总结
环境架构
```
Windows 10/11 + Docker Desktop
│
├── tp8-swoole (phpswoole/swoole:latest)
│ ├── PHP 8.3.17 + Swoole 5.1.7
│ ├── ThinkPHP 8 + think-swoole
│ ├── port 8080 → 宿主机 9501
│ └── 代码挂载: ./tp8 → /app
│
├── tp8-mysql (mysql:8.0-debian)
│ ├── port 3306 → 宿主机 3307
│ ├── 数据库: tp8_swoole
│ └── 用户: tp8 / tp8_pass
│
└── tp8-redis (redis:latest)
└── port 6379 → 宿主机 6380
```
项目文件清单
根目录 (`D:\code\swoole\`)
| 文件 | 说明 |
|------|------|
| `docker-compose.yml` | 三服务编排:swoole + mysql + redis |
| `start.bat` | 项目管理菜单(启动/停止/日志/容器操作) |
| `logs.bat` | 日志实时查看窗口(自动重连) |
| `tp8/` | ThinkPHP 8 项目目录 |
ThinkPHP 项目 (`tp8/`)
**配置文件**
| 文件 | 说明 |
|------|------|
| `.env` | 数据库连接配置(DB_HOST=mysql, 指向 Docker 服务名) |
| `config/swoole.php` | Swoole HTTP 服务 + 队列 worker + Redis 配置 |
| `config/queue.php` | 队列驱动(默认 redis) |
| `route/app.php` | 路由定义(含队列测试路由) |
| `app/event.php` | 事件注册(swoole.init → SwooleInit 监听器) |
**业务代码**
| 文件 | 说明 |
|------|------|
| `app/listener/SwooleInit.php` | 启动事件监听器:输出版本信息(ANSI 绿色) |
| `app/job/TestJob.php` | 队列任务:处理任务数据并删除 |
| `app/controller/Index.php` | 控制器:欢迎页 + 队列测试接口 |
运行方式
双击 `start.bat`
```
============================================
TP8 + Swoole Project Manager
============================================
-
Start all services
-
Stop all services
-
View Swoole logs (live tail)
-
View Swoole logs (last 50 lines)
-
Restart Swoole
-
Enter Swoole container (shell)
-
Exit
```
-
选 **3/4** 会自动检测服务是否运行,未运行则先启动
-
选 **3** 开新窗口实时日志,容器重启后 5 秒自动重连
-
选 **5** 重启 Swoole(不会影响 MySQL/Redis)
手动命令
```bash
启动
cd D:\code\swoole && docker compose up -d
停止
cd D:\code\swoole && docker compose down
查看日志
docker logs tp8-swoole --tail 50 -f
进入容器
docker exec -it tp8-swoole sh
执行 TP 命令
docker exec tp8-swoole php think list
注意:Windows Git Bash 下需要加 MSYS_NO_PATHCONV=1
MSYS_NO_PATHCONV=1 docker run --rm -v /d/code/swoole/tp8:/app -w /app phpswoole/swoole:latest php think list
```
功能特性
1. Swoole HTTP 服务器
-
URL: `http://127.0.0.1:9501`
-
支持热更新(`APP_DEBUG=true` 时自动开启)
-
数据库/缓存连接池
-
多 Worker 进程
2. 启动信息面板
每次启动 Swoole 时,`swoole.init` 事件触发监听器,在控制台输出:
```
████████ Server Information ████████
ThinkPHP Version : 8.0.0
Swoole Version : 5.1.7
MySQL Version : 8.0.40
Hot Update : Enabled
██████████████████████████████████████
```
-
值部分使用 ANSI 绿色显示
-
同时写入 ThinkPHP 运行时日志
3. 队列系统 (think-queue)
-
驱动:**Redis**(默认)
-
Swoole 启动时自动拉起 2 个 queue worker
-
支持即时任务和延迟任务
**测试 API:**
```
GET http://127.0.0.1:9501/queue/push?task=hello
→ 即时入队,立即处理
GET http://127.0.0.1:9501/queue/later?task=delayed
→ 10 秒后处理
```
**测试结果:**
```
Queue\] Processing job: hello \[Queue\] Task 'hello' completed at 2026-05-14 10:27:55 \[Queue\] Processing job: delayed-job-1 \[Queue\] Task 'delayed-job-1' completed at 2026-05-14 10:28:14 \`\`\` ### 4. 数据库连接 - MySQL 8.0.40, 连接池已启用 - 容器内通过服务名 \`tp8-mysql\` 访问 - 宿主机通过 \`127.0.0.1:3307\` 访问 ## 关键技术点 ### Docker 路径问题(Windows Git Bash) Git Bash 会自动转换 Unix 风格路径,需用 \`MSYS_NO_PATHCONV=1\` 前缀: \`\`\`bash MSYS_NO_PATHCONV=1 docker run --rm -v /d/code/swoole:/app ... \`\`\` ### BAT 文件注意事项 - 必须使用 CRLF 行尾符,否则 CMD 不识别标签(\`:MENU\` 等) - \`chcp 65001\` 会导致 \`set /p\` 输入乱码,应避免使用 - 实时日志用 \`start logs.bat\` 开新窗口,避免 Ctrl+C 杀掉主菜单 ### Swoole 事件机制 \`\`\` Manager::start() → initialize() → triggerEvent('init') ← 触发 swoole.init → addHotUpdateProcess() ← 热更新进程 → createPool() ← 创建 Worker 池 → pool-\>on('workerstart') → prepareApplication() ← 初始化 SwooleApp → triggerEvent('workerstart') ← 触发 swoole.workerstart \`\`\` 监听器注册在 \`app/event.php\` 中,键名为 \`swoole.init\`。