

Master 进程、Reactor 线程、Worker 进程、Task 进程、Manager 进程的区别与联系
Master 进程
- Master 进程是一个多线程进程,参考进程 / 线程结构图
Reactor 线程
- Reactor 线程是在 Master 进程中创建的线程
- 负责维护客户端
TCP连接、处理网络IO、处理协议、收发数据 - 不执行任何 PHP 代码
- 将
TCP客户端发来的数据缓冲、拼接、拆分成完整的一个请求数据包
Worker 进程
- 接受由
Reactor线程投递的请求数据包,并执行PHP回调函数处理数据 - 生成响应数据并发给
Reactor线程,由Reactor线程发送给TCP客户端 - 可以是异步非阻塞模式,也可以是同步阻塞模式
Worker以多进程的方式运行
TaskWorker 进程
- 接受由
Worker进程通过 Swoole\Server->task/taskwait/taskCo/taskWaitMulti 方法投递的任务 - 处理任务,并将结果数据返回(使用 Swoole\Server->finish)给
Worker进程 - 完全是同步阻塞模式
TaskWorker以多进程的方式运行,task 完整示例
Manager 进程
- 负责创建 / 回收
worker/task进程
他们之间的关系可以理解为 Reactor 就是 nginx,Worker 就是 PHP-FPM。Reactor 线程异步并行地处理网络请求,然后再转发给 Worker 进程中去处理。Reactor 和 Worker 间通过 unixSocket 进行通信。
在 PHP-FPM 的应用中,经常会将一个任务异步投递到 Redis 等队列中,并在后台启动一些 PHP 进程异步地处理这些任务。Swoole 提供的 TaskWorker 是一套更完整的方案,将任务的投递、队列、PHP 任务处理进程管理合为一体。通过底层提供的 API 可以非常简单地实现异步任务的处理。另外 TaskWorker 还可以在任务执行完成后,再返回一个结果反馈到 Worker。
Swoole 的 Reactor、Worker、TaskWorker 之间可以紧密的结合起来,提供更高级的使用方式。
一个更通俗的比喻,假设 Server 就是一个工厂,那 Reactor 就是销售,接受客户订单。而 Worker 就是工人,当销售接到订单后,Worker 去工作生产出客户要的东西。而 TaskWorker 可以理解为行政人员,可以帮助 Worker 干些杂事,让 Worker 专心工作。
如图:

扩展:
- Master 主进程
- 主进程内有多个 Reactor 线程,基于
epoll/kqueue进行网络事件轮询。收到数据后转发到Worker进程去处理
- 主进程内有多个 Reactor 线程,基于
- Manager 进程
- 对所有
Worker进程进行管理,Worker进程生命周期结束或者发生异常时自动回收,并创建新的Worker进程
- 对所有
- Worker 进程
- 如果开启了
log_file设置,信息会打印到指定的Log文件中。 - 启动失败扩展内会抛出致命错误,请检查
php error_log的相关信息。errno={number}是标准的Linux Errno,可参考相关文档。 - 对收到的数据进行处理,包括协议解析和响应请求。未设置
worker_num,底层会启动与CPU数量一致的Worker进程。
- 如果开启了