page contents

Swoole 的底层架构及运行原理

我们日常开发中主要关注的是 Worker 进程的回调函数,只需要在服务器实例上监听相应的事件,并编写对应的回调函数来处理相应的业务逻辑即可。

attachments-2020-11-SzYcm6kf5fbdd4e5aad46.png

Swoole 的底层架构

首先我们来看下 Swoole 的底层架构:

attachments-2020-11-f5hKIJ615fbdd4f2f3aad.jpg

我们可以看到,Swoole 主要包含以下组件:

  • Master:当我们运行启动 Swoole 的 PHP 脚本时,首先会创建该进程(它是整个应用的 root 进程),然后由该进程 fork 出 Reactor 线程和 Manager 进程。
  • Reactor:Reactor 是包含在 Master 进程中的多线程程序,用来处理 TCP 连接和数据收发(异步非阻塞方式)。Reactor 主线程在 Accept 新的连接后,会将这个连接分配给一个固定的 Reactor 线程,并由这个线程负责监听此 socket。在 socket 可读时读取数据,并进行协议解析,将请求投递到 Worker 进程;在 socket 可写时将数据发送给 TCP 客户端。
  • Manager:Manager 进程负责 fork 并维护多个 Worker 子进程。当有 Worker 子进程中止时,Manager 负责回收并创建新的 Worker 子进程,以便保持 Worker 进程总数不变;当服务器关闭时,Manager 将发送信号给所有 Worker 子进程,通知其关闭服务。
  • Worker:以多进程方式运行,每个子进程负责接受由 Reactor 线程投递的请求数据包,并执行 PHP 回调函数处理数据,然后生成响应数据并发给 Reactor 线程,由 Reactor 线程发送给 TCP 客户端。所有请求的处理逻辑都是在 Worker 子进程中完成,这是我们编写业务代码时真正要关心的部分。
  • Task Worker:功能和 Worker 进程类似,同样以多进程方式运行,但仅用于任务分发,当 Worker 进程将任务异步分发到任务队列时,Task Worker 负责从队列中消费这些任务(同步阻塞方式处理),处理完成后将结果返回给 Worker 进程。

Swoole 官方对 Reactor、Worker、Task Worker有一个形象的比喻,如果把基于 Swoole 的 Web 服务器比作一个工厂,那么 Reactor 就是这个工厂的销售员,Worker 是负责生产的工人,销售员负责接订单,然后交给工人生产,而 Task Worker 可以理解为行政人员,负责提工人处理生产以外的杂事,比如订盒饭、收快递,让工人可以安心生产。


Swoole 的生命周期回调函数

了解了 Swoole 的底层架构后,我们再来看看那些 Swoole 生命周期中的回调函数在哪些进程的哪个阶段被调用,当 Master 主进程启动或关闭时会触发下面这两个回调函数:

onStart
onShutdown

而 Manager 管理进程启动或关闭时会触发下面这两个回调函数:

onManagerStart
onManagerStop

Worker 进程的生命周期中,有多个回调函数:

onWorkerStart:Worker 进程启动时
onWorkerStop:Worker 进程关闭时
onConnect:连接建立时
onClose:连接关闭时
onReceive:收到请求数据时
onFinish:投递的任务处理完成时

Task Worker 进程也有两个回调函数,分别在

onTask:由新任务投递过来时
onWorkerStart:Task Worker 进程启动时也会触发

我们日常开发中主要关注的是 Worker 进程的回调函数,只需要在服务器实例上监听相应的事件,并编写对应的回调函数来处理相应的业务逻辑即可。


attachments-2020-11-48JDjifS5fbdd5062d4ec.jpg原文:https://zhuanlan.zhihu.com/p/96469447

  • 发表于 2020-11-25 11:51
  • 阅读 ( 353 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1478 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章