进程模型

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且没使用 TaskMaxRequest特性时只创建worker进程

Channel

通道,用于协程间通讯,支持多生产者协程和多消费协程。底层自动实现协程的切换额调度。

实现原理:

  • 与PHP的Array类似,仅占内存,没额外的资源申请,均为内存操作,无IO消耗
  • 底层使用PHP引用计数实现,无内存拷贝。即使传递巨大字符串或数组也不会产生额外性能消耗
  • channel基于引用计数实现,是零拷贝的

操作

  • push()
  • pop()
  • stats()
  • close()
  • length()
  • isEmpty()
  • isFull()
  • capacity
  • errCode