workerman代码执行流程简述

jorry

关于workerman框架的内部流程

16048 5 7
5个回答

jorry

首先应该明白进程的含义。
在这里我们要就是它的并发执行的特点。
Workerman也实现了多个进程同时为一个服务端口提供并发处理。

WorkerMan工作原理:
一.从系统以命令行的方式启动服务
服务启动是由系统通过命令行的方式执行一段php代码即:bin/wokermand
1.检测当前的运行环境。
2.设置框架的工作目录:WORKERMAN_ROOT_DIR。
3.载入主进程文件Core/Master类,主进程管理所有子进程,负责自身的运行状态控制和其所有子进程的管理工作。
4.生成单一模式配置对象,对象捆绑的是conf/workerman.conf配置文件及conf.d目录下的所有配置项目,而且conf.d优先级最高,所有配置项都有默认值。
5.启动框架时,php通过接口对系统的进程和进程id(PID)文件进行管理和记录,尽量保证当前只有一个进程在运行。
6.检测启动服务者身份,必须是以root启动。这样做的好处是,保证当前主进程为最高权限。
7.处理具体的命令行指定cmd。
8.最终的结果是:Man\Core\Master::run($worker_user);其中$worker_user为命令的第二个参数。即指定运行子进程的用户权限。

二.对外服务的执行流程
即Man\Core\Master::run();的执行过程。
1.初始化设置主进程名,获取内存资源id,消息队列id,并设置消息队列
2.检测程序运行环境
3.创建两个进程(变成守护进程)不理解。daemonize()
4.保存主进程pid到WORKERMAN_PID_FILE文件
5.创建三个信号:停止服务,挂起重启信号,退出信号installSignal()
6.依据每个conf.d下面的配置文件对应创建一个服务端口createListeningSockets()
7.依据配置conf.d文件创建指定数目的子进程createOneWorker(),并将同一类的子进程与对应配置文件的监听服务绑定。最后启动进程:$worker->start();
spawnWorkers();

三.$worker的启动过程
以上完成了主进程的创建、所有子进程的创建、服务的启动绑定,下面就是worker对象最终将提供的服务。
1.实例化过程和start()过程
(1).完成一些基本的参数初始化工作,如workerName、isPersistentConnection、maxRequests等
(2).使用事件轮询库将事件event绑定。一个worker一个进程,每个worker绑定一个事件轮询库,名字都是Libevent,因为是不同进程,所以互不相干。引入事件轮询库
Man/Core/Events/Libevent.php
(3).初始化与这个进程绑定的事件轮询库Libevent.php,轮询实现了添加、删除、循环三个操作。
(4).轮询库的初始化:申请内存,初始化定时器堆和事件队列,为event_base对象选择底层事件函数封装对象,初始化活动队列。
(5).启动事件机制。一共就三种事件:读事件,写事件,信号事件
(6).进入主体循环,等待触发。

四.Event机制
.......

五.特殊的G/W模型
Gateway专门处理网关,Worker专门处理业务逻辑。
Gateway管理所有的外部网络数据进出,外部数据可以是各种协议进入
它收到数据分进行数据处理,将其打包成二进制,并启动多进程
开通内部即本地端口
最后让其进程和端口绑定处于监听状态。

上述:Gateway一方面处于监听状态接收网关数据,
另一方面为自己开通本地(通常是本地)监听服务,提供给worker使用。
对外是多个进程绑定同一个对外服务,对内一个进程对应一个不同的本地监听服务。
注意:gateway与worker之间是二进制数据传输。

  • 暂无评论
walkor 打赏

解读得超级棒!!!!!!

  • 暂无评论
小玉儿

等我学明白了,我用最直白的语言给你翻译一遍,肯定比这个号理解,只是我还没学明白

  • 暂无评论
小小晨曦

mark~~

  • 暂无评论
walkor 打赏

这个是老版本的workerman,具体的类名配置可能有变化,但是原理是一样的

  • tangzq 2019-10-17

    原来如此,我就说类名都不一样,原来重构过了。

年代过于久远,无法发表回答
×
🔝