用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\`。

相关推荐
Shadow(⊙o⊙)1 小时前
硬核手搓解析!进程-内核分析:命令行参数及环境变量,重构main()
linux·运维·服务器·开发语言·c++·后端·学习
毋语天1 小时前
Claude Code 完整安装与配置指南(含 CC-Switch 多供应商切换工具)
后端·python·ai编程
StackNoOverflow1 小时前
RabbitMQ 入门详解(含安装 + 配置 + 管理后台)
开发语言·后端·ruby
养肥胖虎10 小时前
Docker学习笔记:后端、数据库和反向代理怎么一起跑起来
后端·nginx·docker·postgresql·go·部署
晓杰'11 小时前
从0到1实现 Balatro 游戏后端(2):NestJS框架搭建与项目结构设计
后端·websocket·typescript·node.js·游戏开发·项目实战·nestjs
无所事事O_o11 小时前
二次验证码TOTP 使用说明
后端·二次验证码·谷歌验证器
ltl11 小时前
Multi-Head Attention:为什么要分多个头
后端
ltl12 小时前
Scaled Dot-Product:那个根号 d_k 是怎么来的'
后端
折哥的程序人生 · 物流技术专研14 小时前
《Java 100 天进阶之路》第17篇:Java常用包装类与自动装箱拆箱深入
java·开发语言·后端·面试