网站首页 > 技术文章 正文
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库实例化对象
猜你喜欢
- 2024-10-12 41、php多进程基本用法 php多进程编程
- 2024-10-12 使用 Workman 做一个聊天室 wordpress聊天室插件
- 2024-10-12 21、php面向对象例子-类声明与创建
- 2024-10-12 Web-Frameworks - 谁才是最快的 Web 框架
- 2024-10-12 Casbin实战大揭秘:教育培训领域的创新实践和高效优化策略
- 2024-10-12 go 和 php 性能如何进行对比? go跟php
- 2024-10-12 27、php面向对象例子-接口类 php 面向对象
- 2024-10-12 54、php利用信号实现父子进程间通信
- 2024-10-12 24、php面向对象例子-static关键字
- 2024-10-12 分享一个不错的PHP统计监控系统,值得试一下
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)