用CladueCode来玩tp8+swoole(常用案例)
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
============================================
1. Start all services
2. Stop all services
3. View Swoole logs (live tail)
4. View Swoole logs (last 50 lines)
5. Restart Swoole
6. Enter Swoole container (shell)
0. 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`。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)