用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)

  7. 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`。

相关推荐
集成显卡7 小时前
Rust实战七 |基于带 colored 颜色文字控制台的批量文件删除工具
开发语言·后端·rust
jeffer_liu8 小时前
Spring AI 生产级实战:工具调用
java·人工智能·后端·spring·ai编程
Cosolar9 小时前
AutoGen 精通教程:从零到企业级多 Agent 系统架构师
人工智能·后端·面试
狂炫冰美式10 小时前
你还在古法PPT吗,试试HTML呢?免费编辑导出工具给 xdm 放这了
前端·后端·github
万少11 小时前
未来组织的分水岭不是员工数量,而是人才密度
前端·后端·面试
Honmaple11 小时前
终端 AI 编程的两条路:Pi 极简哲学 vs Oh-My-Pi 全能主义深度对决
后端
我是一颗柠檬12 小时前
【Redis】发布订阅与消息队列Day8(2026年)
数据库·redis·后端·缓存
道友可好12 小时前
OpenSpec:轻到起飞的 AI 编程规范层
前端·人工智能·后端
IT_陈寒12 小时前
React状态管理这个坑,我爬了整整三天才出来
前端·人工智能·后端