Swoole 的底层架构及运行原理
前面我们已经陆续介绍了 Swoole 提供的各种功能,回过头来再看 Swoole 官网的那句 Slogan:「面向生产环境的 PHP 异步网络通信引擎」,想必你会有更加深切的体会,有了 Swoole 扩展,我们可以在 PHP 中轻松实现多进程、异步编程和并发编程,从而开发出高性能、可扩展的 Web 应用。
接下来,我们来探讨下 Swoole 的底层架构和运行原理,以便你可以在开发过程中更好的使用 Swoole。
Swoole 的底层架构
首先我们来看下 Swoole 的底层架构:
注:图片来源于另一个 Laravel Swoole 扩展
swooletw/laravel-swoole
的 wiki。
我们可以看到,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 主进程启动或关闭时会触发下面这两个回调函数:
而 Manager 管理进程启动或关闭时会触发下面这两个回调函数:
Worker 进程的生命周期中,有多个回调函数:
- onWorkerStart:Worker 进程启动时
- onWorkerStop: Worker 进程关闭时
- onConnect:连接建立时
- onClose:连接关闭时
- onReceive:收到请求数据时
- onFinish:投递的任务处理完成时
Task Worker 进程也有两个回调函数,分别在
- onTask:由新任务投递过来时
- onWorkerStart:Task Worker 进程启动时也会触发
我们日常开发中主要关注的是 Worker 进程的回调函数,只需要在服务器实例上监听相应的事件,并编写对应的回调函数来处理相应的业务逻辑即可。
下篇教程,我们将结合 Swoole 服务器 + Laravel 框架启动的生命周期来分析在为什么 Swoole 能加速 Laravel 应用,以及在 Laravel 开发过程中使用 Swoole 时要注意哪些事项。
2 Comments
Task Worker 可以理解为行政人员,负责提工人处理生产以外的杂事,比如订盒饭、收快递,让工人可以安心生产。 这句话有点不大好理解, 异步任务最终投递执行的地方是 task worker吧?那么真正干活的应该是Task worker进程吧?
task worker干耗时长任务重的活