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

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐