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 进程
他们之间的关系可以理解为 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
进程去处理
- Manager 进程
- 对所有
Worker
进程进行管理,Worker
进程生命周期结束或者发生异常时自动回收,并创建新的 Worker
进程
- Worker 进程
- 如果开启了
log_file
设置,信息会打印到指定的 Log
文件中。 - 启动失败扩展内会抛出致命错误,请检查
php error_log
的相关信息。errno={number}
是标准的 Linux Errno
,可参考相关文档。 - 对收到的数据进行处理,包括协议解析和响应请求。未设置
worker_num
,底层会启动与 CPU
数量一致的 Worker
进程。