swoole
文章目录
进程模型
Master进程
- 多线程进程
- Master线程
- Accept
- 信号处理
- 定时器任务
- 业务逻辑
- 心跳检测线程
Reactor线程
- 在Master中创建的线程
- 负责额外客户端TCP连接、处理网络IO、处理协议、收发数据
- 不执行PHP代码
- 将TCP客户端发来的数据缓冲、拼接、拆分成完整的一个数据请求包
Worker进程
- 接收Reactor投递的数据包
- 生成数据返回给Reactor线程,再返回给TCP客户端
- 异步非阻塞和同步阻塞
- Worker多进程方式运行
TaskWorker进程
- 接受
Worker
进程通过taskCo
方法投递的任务 - 处理任务并返回给
Worker
进程 - 完全是同步阻塞模式
TaskWorker
以多进程方式运行
Manager进程
- 负责创建/挥手
worker
/task
进程
理解为Reactor是Nginx,Worker是PHP-FPM,Reactor和Worker之间通过unixSocket进行通信。
Server两种运行模式
SWOOLE_PROCESS
优点:
- 连接与数据请求发送是分离的,不会因为数据量大小导致Worker进程不均衡
- Worker进程发生致命错误时,连接不会被切断
- 可实现单连接并发,仅保持少量TCP连接,并发地在多个Worker进程中处理
缺点:
- 存在两次IPC开销,master与worker使用unixSocket进行通信
- 不支持 PHP ZTS(线程安全)
SWOOLE_BASE
传统的异步非阻塞Server,与Nginx和Node.js一致
- BASE模式下没Master角色,只有Manger角色
- 每个Worker进程同时承担Reactor和Worker进程两部分职责
- Manager可选,
worker_num=1
且没使用Task
和MaxRequest
特性时只创建worker进程
Channel
通道,用于协程间通讯,支持多生产者协程和多消费协程。底层自动实现协程的切换额调度。
实现原理:
- 与PHP的Array类似,仅占内存,没额外的资源申请,均为内存操作,无IO消耗
- 底层使用PHP引用计数实现,无内存拷贝。即使传递巨大字符串或数组也不会产生额外性能消耗
- channel基于引用计数实现,是零拷贝的
操作
- push()
- pop()
- stats()
- close()
- length()
- isEmpty()
- isFull()
- capacity
- errCode
文章作者 小叨
上次更新 2023-04-20