swoole进程结构

简介: 进程结构官方文档:https://wiki.swoole.com/#/learn?id=diff-process

参考文献

进程结构官方文档:https://wiki.swoole.com/#/learn?id=diff-process

进程结构图:https://wiki.swoole.com/#/server/init?id=%e8%bf%9b%e7%a8%8b%e7%ba%bf%e7%a8%8b%e7%bb%93%e6%9e%84%e5%9b%be

Swoole进程结构

  • Master 进程 (主进程)
  • Manager 进程 (管理进程)
  • Worker 进程 (工作进程)
  • task 进程 (异步任务工作进程)

image-20210524132300439

client与server的交互

1、client 请求到达main reactor,与master进程中的某个reactor线程连接

2、main reactor将请求注册给对应的reactor

3、客户端有变化时reactor将数据交给worker处理

4、worker处理完毕,通过进程间通信,发给对应的reactor

5、reactor将响应结果发给相应的连接请求处理完成

6、Manager 负责 (创建/回收)worker/task 进程

主要进程说明

Master进程

Master进程主要用来保证Swoole框架机制的运行。它会创建几个功能性的线程:

  • Reactor线程:就是真正处理TCP连接,收发数据的线程。swoole的主线程在Accept新的连接后,会将这个连接分配给一个固定的Reactor线程,并由这个线程负责监听此socket。在socket可读时读取数据,并进行协议解析,将请求投递到Worker进程。在socket可写时将数据发送给TCP客户端。
  • Master线程(主线程): 负责:Accept新的连接、UNIX PROXI信号处理、定时器任务。
  • 心跳包检测线程:(略)
  • UDP收包线程:(略)

Manager进程

swoole中Worker/Task进程都是由Manager进程Fork并管理的。

  • 子进程结束运行时,manager进程负责回收此子进程,避免成为僵尸进程。并创建新的子进程
  • 服务器关闭时,manager进程将发送信号给所有子进程,通知子进程关闭服务
  • 服务器reload时,manager进程会逐个关闭/重启子进程

为什么不是Master进程呢,主要原因是Master进程是多线程的,不能安全的执行fork操作。

Worker进程

  • 接受由Reactor线程投递的请求数据包,并执行PHP回调函数处理数据
  • 生成响应数据并发给Reactor线程,由Reactor线程发送给TCP客户端
  • 可以是异步非阻塞模式,也可以是同步阻塞模式
  • Worker以多进程的方式运行

Swoole提供了完善的进程管理机制,当Worker进程异常退出,如发生PHP的致命错误、被其他程序误杀,或达到max_request次数之后正常退出。主进程会重新拉起新的Worker进程。 Worker进程内可以像普通的apache+php或者php-fpm中写代码。不需要像Node.js那样写异步回调的代码。

Task进程

  • 接受由Worker进程通过swoole_server->task/taskwait方法投递的任务
  • 处理任务,并将结果数据返回给Worker进程
  • 完全是同步阻塞模式
  • Task以多进程的方式运行

Task进程的全称是task_worker进程,是一种特殊的worker进程。所以onWorkerStart在task进程中也会被调用。

$worker_id >= $serv->setting['worker_num']时表示这个进程是task_worker,否则,代表此进程是worker进程。

进程与事件回调的对应关系

Master进程内的回调函数

onStart
onShutdown
onMasterConnect
onMasterClose
onTimer

Worker进程内的回调函数

onWorkerStart
onWorkerStop
onConnect
onClose
onReceive
onTimer
onFinish

Task进程内的回调函数

onTask
onWorkerStart

Manager进程内的回调函数

onManagerStart
onManagerStop

通俗比喻

假设Server就是一个工厂,那Reactor就是销售,接受客户订单。而Worker就是工人,当销售接到订单后,Worker去工作生产出客户要的东西。而TaskWorker可以理解为行政人员,可以帮助Worker干些杂事,让Worker专心工作。 Manager 相当于HR,负责招聘员工(Worker),或者把不干活的员工(Worker)开除。

image-20210524133823196

Swoole进程测试

测试代码

<?php
$server = new Swoole\Server('127.0.0.1', 9503);

{
   
   mathJaxContainer[1]}server, $fd){
   
   
  echo "connection open: {$fd}\n";
});

{
   
   mathJaxContainer[2]}server, {
   
   mathJaxContainer[3]}reactor_id, $data) {
   
   
  {
   
   mathJaxContainer[4]}fd, "Swoole: {$data}");
  {
   
   mathJaxContainer[5]}fd);
});

{
   
   mathJaxContainer[6]}server, $fd) {
   
   
  echo "connection close: {$fd}\n";
});

$server->start();

进程查看

image-20210524134625911

相关文章
|
8月前
|
Unix 程序员 Linux
进程-操作系统结构
进程-操作系统结构
29 0
|
8月前
|
Linux 定位技术 虚拟化
【OSTEP】多道程序和时分共享 | 虚拟地址空间 | 用户栈vs内核栈 | 进程结构: struct thread | 虚拟vs物理地址空间 | 地址转换方案
【OSTEP】多道程序和时分共享 | 虚拟地址空间 | 用户栈vs内核栈 | 进程结构: struct thread | 虚拟vs物理地址空间 | 地址转换方案
25 0
|
存储 SQL 安全
2 PostgreSQL 物理,逻辑,进程结构以及系统表系统函数|学习笔记
快速学习2 PostgreSQL 物理,逻辑,进程结构以及系统表系统函数
344 0
2 PostgreSQL 物理,逻辑,进程结构以及系统表系统函数|学习笔记
|
网络协议 PHP
Swoole 中通过 process 模块实现多进程
Swoole 中通过 process 模块实现多进程
178 0
Swoole 中通过 process 模块实现多进程
|
Oracle 关系型数据库 数据库
|
监控 数据库 调度
进程结构
一、数据写入进程(DBWn) 数据写入进程是Oracle的一个后台进程,所谓后台进程是相对于前台进程(服务器进程)来讲的。DBWn的"n"意味着一个实例是可以有多个数据库写入器的。作用 简而言之,DBWn的作用就是将变脏了的缓冲区从数据库缓冲区缓存中写入到磁盘中的数据文件中去。
1131 0
|
存储 Oracle 关系型数据库
|
SQL 存储 监控
DBA_Oracle基本体系内存和进程结构(概念)
2014-08-05 Created By BaoXinjian 一、摘要 1. Oracle的内存结构 内存结构式Oracle数据库体系中最为重要的一部分,内存也是印象数据库性能的第一因素 分类 系统全局区SGA (System Global Area) 程序全局区PGA (...
1117 0
|
Linux 索引 Unix
与进程联系的文件系统相关结构
进程是通过文件描述符(file descriptor,fd)来访问文件的,每个进程最多能同时使用NR_OPEN个文件描述符,这个值在include/linux/limits.h中定义为1024。每一个进程用一个打开文件表files_struct来描述进程的文件描述符使用情况。
704 0