PHP Swoole 启动时的进程关系
PHP Swoole 启动时的进程关系可以分为以下层次结构,各进程协作高效处理高并发请求:
1. Master 进程(主进程)
- 角色:负责网络事件监听(如端口监听)、管理 Reactor 线程及协调进程间通信。
- 线程模型:
- 包含多个 Reactor 线程(默认数量与 CPU 核数相同),处理连接/数据接收等 I/O 事件。
- 通过多线程实现高并发连接处理,将请求分发给 Worker 进程。
- 特点:常驻内存,不处理具体业务逻辑,仅负责事件分发。
2. Manager 进程(管理进程)
- 角色:由 Master 进程创建,负责 Worker/Task 进程的生命周期管理。
- 职责:
- 根据配置(
worker_num
、task_worker_num
)创建并监控 Worker 和 Task Worker 进程。 - 在 Worker 异常退出时自动重启新进程,保障服务稳定性。
- 根据配置(
- 通信方式:通过 Unix 信号或管道与 Worker 进程通信。
3. Worker 进程(工作进程)
- 角色:处理具体业务逻辑(如 HTTP 请求、WebSocket 消息)。
- 特点:
- 数量由
worker_num
配置,独立处理请求(进程隔离,避免互相阻塞)。 - 默认为同步阻塞模式,可通过协程或异步回调实现非阻塞操作。
- 数量由
- 生命周期:由 Manager 进程创建和回收,支持热重启(代码更新后重启 Worker 而不中断服务)。
4. Task Worker 进程(异步任务进程)
- 角色:专门处理耗时任务(如数据库写入、文件处理),避免阻塞主业务逻辑。
- 配置:通过
task_worker_num
指定数量,独立于普通 Worker。 - 通信:Worker 进程通过
task()
方法投递任务,Task Worker 异步处理并返回结果。
进程关系树
Master Process (主进程,管理 Reactor 线程)
│
├── Manager Process (管理进程,监控 Worker)
│ │
│ ├── Worker Processes (普通工作进程,数量=worker_num)
│ │
│ └── Task Worker Processes (异步任务进程,数量=task_worker_num)
│
└── Reactor Threads (多个线程,处理网络 I/O)
关键协作机制
- 事件分发:Master 的 Reactor 线程监听到事件后,将请求分配给 Worker 进程处理。
- 进程隔离:Worker 崩溃不影响 Master/Manager,由 Manager 自动重启新进程。
- 热重启:通过
kill -USR1 MasterPID
触发,仅重启 Worker 进程以加载新代码。 - 数据共享:通过 Swoole\Table、Atomic 或 Redis 等外部存储,避免进程间直接内存共享。
配置示例(Server 初始化)
$server = new Swoole\Http\Server("0.0.0.0", 9501);
$server->set([
'worker_num' => 4, // 4 个 Worker 进程
'task_worker_num' => 2, // 2 个 Task Worker
'daemonize' => false, // 非守护进程(调试时建议关闭)
]);
流程图:请求处理过程
- 客户端请求 → Master 的 Reactor 线程接收。
- Reactor 线程 → 将请求分发给空闲 Worker。
- Worker 进程 → 处理业务逻辑,若需异步任务,调用
task()
投递给 Task Worker。 - Task Worker → 处理完成后,结果返回给 Worker。
- Worker → 发送响应给客户端。
此架构充分利用多核 CPU,通过多进程避免单点阻塞,结合异步非阻塞 I/O 提升性能,适用于高并发场景如实时推送、微服务等。