您好,欢迎访问一九零五行业门户网

对swoole的架构分析

本篇文章给大家带来的内容是关于对swoole的架构分析,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
结构图如下:
swoole主要由master进程(主进程)和manager进程配合使用完成其功能。
master进程是一个多线程的程序。其中有一组很重要的线程,称之为reactor线程。它就是真正处理tcp连接,收发数据的线程。
manager进程管理worker/task进程。worker/task进程都是由manager进程fork并管理的。
reactor线程主线程(master进程)在accept新的连接后,会将这个连接分配给一个固定的reactor线程,并由这个线程负责监听此socket。在socket可读时读取数据,并进行协议解析,将请求投递到worker进程。
负责维护客户端tcp连接、处理网络io、处理协议、收发数据
完全是异步非阻塞的模式
全部为c代码,除start/shudown事件回调外,不执行任何php代码
将tcp客户端发来的数据缓冲、拼接、拆分成完整的一个请求数据包
reactor以多线程的方式运行
work进程类似与php-fpm进程。
接受由reactor线程投递的请求数据包,并执行php回调函数处理数据
生成响应数据并发给reactor线程,由reactor线程发送给tcp客户端
可以是异步模式,也可以是同步模式
worker以多进程的方式运行
taskworker进程异步处理其他任务的进程,使用方方式类似与gearman。
接受由worker进程通过swoole_server->task/taskwait方法投递的任务
处理任务,并将结果数据返回(swoole_server->finish)给worker进程
taskworker以多进程的方式运行
关系可以理解为reactor就是nginx,worker就是php-fpm。reactor线程异步并行地处理网络请求,然后再转发给worker进程中去处理(在回调函数中处理)。reactor和worker间通过unixsocket进行通信。
事件处理流程
了解swoole事件处理流程,先了解两种网络事件处理模式。
reactor模式它要求主线程(i/o处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将该事件通知工作线程/进程(逻辑单元)。除此之外,主线程不做任何其他工作。读写数据,接受新的连接,以及处理客户请求均在工作线程中完成。
proactor模式两种实现使用i/o异步模型实现proactor模式。原理:将所有i/o操作都交给主线程,主线程配合和内核来处理,业务逻辑操作就交给逻辑单元。例如使用aio_read来实现。
工作流程:
主线程调用aio_read函数向内核注册socket上的读完成事件。
主线程继续处理其他i/o事件。
当socket上的数据被读入用户缓冲区后,内核向应用程序(逻辑单元)发送一个信号,通知应用程序数据可用。
应用程序读取数据(客户端的请求),处理完后,调用aio_write函数向内核注册socket上的写事件。
主线程继续处理其他逻辑。
当用户缓冲区的数据写入socket后,内核向应用程序发送一个信号,通知应用程序数据发送完毕。
应用程序预先定义好的信号处理函数来处理善后处理,比如关闭socket.
使用i/o同步模型实现proactor模式。原理:主线程执行i/o事件数据的读写操作,业务逻辑操作就交给逻辑单元。例如使用epoll来实现。
工作流程:
主线程往epoll内核事件表中注册socket上的读就绪事件。
主线程调用epoll_wait等待socket上有数据可读。
epoll_wait有返回后,主线程从socket上读取数据,然后将读取到的数据封装成一个请求对象(客户端的请求),并插入请求队列。
于是队列的消费者线程处理请求对象,然后在epoll内核事件表中注册socket上的写就绪事件。
主线程调用epoll_wait等待socket可写。
当socket可写时,epoll_wait通知主线程。主线程往socket写入请求结果。
swoole事件架构图
从图可以看出,如果我们把reactor线程和work进程组合起来,看成工作线程的话,swoole使用的是reactor事件处理模式。
一个请求经历的步骤如下:
1. 服务器主线程等待客户端连接。
2. reactor线程处理接连socket,读取socket上的请求数据(receive),将请求封装好后投递给work进程。
3. work进程就是逻辑单元,处理业务数据。
4. work进程结果返回给reactor线程。
5. reactor线程将结果写回socket(send)。
每个模块的工作请回顾上面的结构介绍。
相关推荐:
如何自定义一个model?thinkphp3.2自定义基类model的用法
如何用php读取excel文件内容、获取单元格数据
以上就是对swoole的架构分析的详细内容。
其它类似信息

推荐信息