计算机系统应用教程网站

网站首页 > 技术文章 正文

82、Workerman通信框架-核心Worker类源码阅读

btikc 2024-10-12 11:13:40 技术文章 7 ℃ 0 评论

1、Worker执行流程

  • 调用构造方法,实例化对象
  • 执行静态方法runAll

2、执行方法

2.1、构造方法__construct

  • spl_object_hash生成当前实例化对象的唯一标识符
  • 静态属性数组 static::$_workers 以唯一标识符为键保存当前实例化对象
  • 静态属性数组 static::$_pidMap 以唯一标识符为键保存空数组
  • 属性 $this->_autoloadRootPath 保存自动加载的根目录
  • 属性 $this->_socketName 保存socket服务参数
  • 属性 $this->_context 设置服务上下文

2.2、静态方法 runAll

static::checkSapiEnv();

static::init();

static::parseCommand();

static::daemonize();

static::initWorkers();

static::installSignal();

static::saveMasterPid();

static::displayUI();

static::forkWorkers();

static::resetStd();

static::monitorWorkers();

2.3、checkSapiEnv

检测运行环境

  • php_sapi_name()检测是否为cli环境
  • 检查当前的操作系统

2.4、静态方法 init

初始化

2.4.1、属性设置

static::$_startFile 设置启动文件

static::$pidFile 主进程id文件

static::$logFile 设置日志文件

static::$_status 状态

static::$_statisticsFile 统计状态文件

2.4.2、方法

  • static::initId() 初始化当前实例化对象的工作进程id属性数组

array(

对象唯一标识符 => array(

0 => 0,

1 => 0,

n => 0,

)

)

  • Timer::init() 设置闹钟信号

2.5、静态方法 parseCommand

解析命令行参数,只针对linux系统

  • 当命令为start时,从主进程id文件-static::$pidFile中获取主进程id,用posix_kill(主进程id, 0)判断当前的状态,是否存活。如存活则直接终止
  • 判断当前运行的命令
  • status

删除static::$_statisticsFile 统计状态文件,并向主进程发送信号,posix_kill($master_pid, SIGUSR2),暂停1秒,从static::formatStatusData()中获取统计结果,并打印

  • connections

删除static::$_statisticsFile 统计状态文件,并向主进程发送信号,posix_kill($master_pid, SIGIO)

暂停,再读取并打印

  • restart或stop

判断是否为优雅操作,如是则向主进程发送SIGTERM,相反则是SIGINT

  • reload

判断是否为优雅操作,如是则向主进程发送SIGQUIT,相反则是SIGUSR1

2.6、静态方法 daemonize

设置后台运行,只针对命令启动-d和linux系统

返回旧的umask

通过pcntl_fork(),让子进程继续运行

通过posix_setsid(),把当前的子进程设置为回话的领导者

再次pcntl_fork(),让子进程继续运行,脱离终端

2.7、静态方法 initWorkers

只针对linux系统

遍历static::$_workers静态属性数组,对数组的每个实例化worker对象,设置name、运行用户等

当实例化worker对象的reusePort属性为false,调用listen方法,创建socket,设置传输层、应用层参数。并进行socket监听

2.7.1、listen()

调用stream_socket_server,创建每个worker实例化对象的属性 _mainSocket

2.8、静态方法 installSignal

只指针linux系统,安装信号

当前worker类的静态方法signalHandler触发信号

2.9、静态方法 saveMasterPid

获取当前进程id,并把其持久化

2.10、静态方法 displayUI

往终端展示信息

2.11、静态方法 forkWorkers

根据当前的系统,调用相应的方法,进行fork工作进程操作

  • 针对linux系统 forkWorkersForLinux

根据属性count循环调用 forkOneWorkerForLinux方法,创建工作进程,并执行run。接收请求

  • 针对windows系统 forkWorkersForWindows

根据命令行传入的参数进行判断,如果执行文件大于1,则调用forkOneWorkerForWindows

2.12、静态方法 resetStd

重定向输出到垃圾箱(/dev/null)

2.13、静态方法 monitorWorkers

主进程监听所有子进程

3、总结

3.1、执行流程图

3.2、主要属性说明

  • static::$_workers

保存所有实例化Worker类对象的数组.格式如下:

array(

spl_object_hash($this) => $this

)

  • static::$_pidMap

保存所有实例化Worker类对象所fork出的子进程数组.格式如下:

array(

spl_object_hash($this) => array(

子进程的进程id => 子进程的进程id

)

)

  • static::$_idMap

保存初始化当前实例化对象的工作进程id属性数组.格式如下:

array(

spl_object_hash($this) => array(

自增数字 => 子进程的进程id,

)

)

  • static::$_pidsToRestart

保存需要重启的进程id数组.格式如下:

array(

子进程的进程id => 子进程的进程id,

)

  • socket相关属性

_mainSocket : 保存每个Worker实例化对象的socket链接

transport : 创建每个Worker实例化对象的socket服务所需要的传输层

protocol : 创建每个Worker实例化对象的socket服务所需要的应用层

  • static::$globalEvent

保存网络IO库实例化对象

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表