二 分析easyswoole源码(启动服务)
前文连接,阅读的时候最好参照EasySwoole2.1.2的源码
$inst->run();//启动服务
这里实际调用的是Core的start方法ServerManager::getInstance()->start();
这个方法主要是启动swoole服务的
//创建主服务
$this->createMainServer();
在这块代码里主要是核心,是在swoole执行start服务前设置相关配置以及配置相关回调函数。具体代码如下
先给服务器配置相关运行参数
$conf = Config::getInstance()->getConf("MAIN_SERVER");//获取Config.php 中配置的MAIN_SERVER数组
$runModel = $conf['RUN_MODEL'];//获取运行模式 默认是SWOOLE_PROCESS模式,使用进程模式,业务代码在Worker进程中执行
$host = $conf['HOST'];//获取运行的host 'HOST'=>'0.0.0.0',
$port = $conf['PORT'];//获取配置的运行端口为9501 'PORT'=>9501,
$setting = $conf['SETTING'];//这里设置的相关的配置项,这些配置做一些解释,参照https://wiki.swoole.com/wiki/page/274.html
'SETTING'=>[
'task_worker_num' => 8, //配置Task进程的数量,配置此参数后将会启用task功能。所以Server务必要注册onTask、onFinish2个事件回调函数。如果没有注册,服务器程序将无法启动。
'task_max_request'=>10,//设置task进程的最大任务数。一个task进程在处理完超过此数值的任务后将自动退出。这个参数是为了防止PHP进程内存溢出。如果不希望进程自动退出可以设置为0,炒鸡重要,进程中的数据,如果有一个global数组,或者全局变量,不设置这个就会不回收最终导致内存溢出
'max_request'=>5000,//设置worker进程的最大任务数,这个和task_max_request功能一样,为了解决PHP进程内存溢出问题
'worker_num'=>8//设置启动的Worker进程数
],
//其实这里还有2个配置,是前文中提到的,在前文19行$this->sysDirectoryInit();会初始化配置pid_file和log_file
pid_file //在Server启动时自动将master进程的PID写入到文件,在Server关闭时自动删除PID文件。
log_file //指定swoole错误日志文件。在swoole运行期发生的异常信息会记录到这个文件中。默认会打印到屏幕。
$sockType = $conf['SOCK_TYPE'];//指定当前运行的服务是什么服务器。有tcp服务,http服务,websocket服务。默认是tcp服务
switch ($conf['SERVER_TYPE']){
case self::TYPE_SERVER:{
$this->mainServer = new \swoole_server($host,$port,$runModel,$sockType);//创建mainServer,这里创建了一个tcp服务器
break;
}
case self::TYPE_WEB_SERVER:{
$this->mainServer = new \swoole_http_server($host,$port,$runModel,$sockType);//web方式是默认
break;
}
case self::TYPE_WEB_SOCKET_SERVER:{
$this->mainServer = new \swoole_websocket_server($host,$port,$runModel,$sockType);
break;
}
default:{
Trigger::throwable(new \Exception("unknown server type :{$conf['SERVER_TYPE']}"));
}
}
$this->mainServer->set($setting);//将上面的相关服务启动配置到mainServer
创建默认的事件注册器,给服务注册默认的是事件处理函数
$register = new EventRegister();
$this->finalHook($register);
EasySwooleEvent::mainServerCreate($this,$register);//这里是框架全局事件mainServerCreate主服务创建事件
$events = $register->all();
//然后循环给swoole服务器绑定回调函数。这里同一个回调方法设置多个回调函数
foreach ($events as $event => $callback){
$this->mainServer->on($event, function () use ($callback) {
$ret = [];
$args = func_get_args();
foreach ($callback as $item) {
array_push($ret,Invoker::callUserFuncArray($item, $args));
}
if(count($ret) > 1){
return $ret;
}
return array_shift($ret);
});
}
这里提一下finalHook具体做了什么操作
$this->finalHook($register);
//实例化对象池管理
PoolManager::getInstance();
//register,先绑定一个workerStart回调函数。此事件在Worker进程/Task进程启动时发生。这里创建的对象可以在进程全局周期内使用。
$register->add($register::onWorkerStart,function (\swoole_server $server,int $workerId){
PoolManager::getInstance()->__workerStartHook($workerId);
$workerNum = Config::getInstance()->getConf('MAIN_SERVER.SETTING.worker_num');
$name = Config::getInstance()->getConf('SERVER_NAME');
if(PHP_OS != 'Darwin'){
if($workerId <= ($workerNum -1)){//判断当前是否是worker进程
$name = "{$name}_Worker_".$workerId;
}else{//这个是task进程
$name = "{$name}_Task_Worker_".$workerId;
}
cli_set_process_title($name);//设置当前的进程名称
//图片
}
});
//EventHelper 是一个框架提供的默认的事件处理函数(这些放到后面具体讲述)
EventHelper::registerDefaultOnTask($register);//注册默认的task回调,处理task任务的具体函数
EventHelper::registerDefaultOnFinish($register);//注册默认的task任务完成后的回调
EventHelper::registerDefaultOnPipeMessage($register);//注册pipeMessage回调函数
$conf = Config::getInstance()->getConf("MAIN_SERVER");
//如果是http服务器或者websocket,需要注册request回调函数
if($conf['SERVER_TYPE'] == self::TYPE_WEB_SERVER || $conf['SERVER_TYPE'] == self::TYPE_WEB_SOCKET_SERVER){
if(!$register->get($register::onRequest)){
EventHelper::registerDefaultOnRequest($register);//这里包含了请求,然后路由解析,处理返回的功能。就跟一般web框架类似
}
}
系统启动后,在worker启动的时候,会进行改名的操作,如下图

最后注册相关的cache监听端口等就启动swoole服务了。
Cache::getInstance(); //这里注册Cache
Cluster::getInstance()->run(); //实现RPC
CronTab::getInstance()->run(); //定时任务
$this->attachListener();//Swoole提供了swoole_server::addListener来增加监听的端口。业务代码中可以通过调用swoole_server::connection_info来获取某个连接来自于哪个端口。这里框架启动的时候host配置的是0.0.0.0 所以监听所有地址,就没必要设置这个了
$this->isStart = true;
$this->getServer()->start();//启动swoole服务器,在这之前创建的对象都在程序全局期中
下篇文章介绍TableManager。因为它在很多地方都被用到了。
二 分析easyswoole源码(启动服务)的更多相关文章
- 一 分析easyswoole源码(启动服务)
分析easyswoole源码 1以启动为例 //检查是否已经安装 installCheck();//检查锁文件是否存在,不存在结束 //启动服务 serverStart showLogo();//显示 ...
- 四 分析easyswoole源码(启动服务&Cache组件原理)
前文提到的在系统设置Cache组件 Cache::getInstance()的时候,会去调用processManager去创建Cache的进程,然后以管道通信的方式进行设置缓存和获取缓存. Cache ...
- 三 分析easyswoole源码(启动服务&TableManager,略提及Cache工具的原理)
前文连接,讲了es是如何启动swoole服务的. 里面有一个工具类TableManager.这个类为了处理进程间数据共享.是对swoole_table的一层封装swoole_table一个基于共享内存 ...
- Netty源码解析---服务端启动
Netty源码解析---服务端启动 一个简单的服务端代码: public class SimpleServer { public static void main(String[] args) { N ...
- Java 序列化和反序列化(二)Serializable 源码分析 - 1
目录 Java 序列化和反序列化(二)Serializable 源码分析 - 1 1. Java 序列化接口 2. ObjectOutputStream 源码分析 2.1 ObjectOutputSt ...
- 如何分析SpringBoot源码模块及结构?--SpringBoot源码(二)
注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 前言 本篇接 如何搭建自己的SpringBoot源码调试环境?--SpringBoot源码(一). 前面搭建好了自己本地的S ...
- k8s client-go源码分析 informer源码分析(2)-初始化与启动分析
k8s client-go源码分析 informer源码分析(2)-初始化与启动分析 前面一篇文章对k8s informer做了概要分析,本篇文章将对informer的初始化与启动进行分析. info ...
- 【一起学源码-微服务】Nexflix Eureka 源码十三:Eureka源码解读完结撒花篇~!
前言 想说的话 [一起学源码-微服务-Netflix Eureka]专栏到这里就已经全部结束了. 实话实说,从最开始Eureka Server和Eureka Client初始化的流程还是一脸闷逼,到现 ...
- 【一起学源码-微服务】Eureka+Ribbon+Feign阶段性总结
前言 想说的话 这里已经梳理完Eureka.Ribbon.Feign三大组件的基本原理了,今天做一个总结,里面会有一个比较详细的调用关系流程图. 说明 原创不易,如若转载 请标明来源! 博客地址:一枝 ...
随机推荐
- DotNetBar中Supergrid显示树形数据
1.向窗体中拖一个Supergrid控件 2.添加列ID,NAME,MATH,CN,SEX 3.在任务窗格中勾选“Show Tree Lines”和“Show Tree Buttons” 4.添加数据 ...
- 黄聪:visual studio 2017编译运行出现脚本发生错误等问题如何解决?
升级VS2017后,编译运行程序会出现 /Community/Common7/IDE/PrivateAssemblies/plugin.vs.js 错误 先说VS2017-15.6.1跟旧版本IE的兼 ...
- 51nod1340 地铁环线
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1340 设x为环线的长度,要判断某个特定的x是否可行,不难将题目转为差分约 ...
- eclipse开发Java web工程时,jsp第一行报错,如何解决?
与myeclipse不同,eclipse开发java web项目时是要下载第三方软件(服务器)的,正是这个原因,很多初学者用eclipse学习java web的时候,总是会遇到一些小问题.其中常见的一 ...
- 反序列化和序列化xml使用反射处理节点的属性
当一个xml中有大量的属性XmlAttribute需要序列化和反序列化,通常需要复制粘贴大量的如下代码,显得很丑陋,而且容易出错: XmlAttribute attr = Doc.CreateAttr ...
- css3兼容性检测工具
1. Modernizr 会在Modernizr 会在页面加载后立即检测特性:然后创建一个包含检测结果的 JavaScript 对象,同时在 html 元素加入方便你调整 CSS 的 class ...
- k8s学习笔记之五:Pod资源清单spec字段常用字段及含义
第一章.前言 在上一篇博客中,我们大致简述了一般情况下资源清单的格式,以及如何获得清单配置的命令帮助,下面我们再讲解下清单中spec字段中比较常见的字段及其含义 第二章.常用字段讲解 spec.con ...
- WebService . Schema约束
1. namespace 相当于schema文件的id 2. targetNamespace属性 用来指定schema文件的namespace的值 3. xmlns属性 引入一个约束, 它的值是一个s ...
- Java 性能调优工具
CPU使用率工具: vmstat 检查应用性能时,应该首先审查CPU时间.代码优化的目的是提升而不是降低(更短时间段内的)CPU的使用率.在试图深入优化应用前,应该先弄清楚为何CPU使用率低.磁盘使用 ...
- 高校手机签到系统——第一部分Authority权限系统(上)
序:今天开始写一个算是我第一个系列的文章——高校手机签到系统.本系统结合我们学校自身的一些特点编写.这是我的毕业设计项目,写在这里算是给最后论文的时候一些点滴的记录.另外也想通过这个系列的文章找到一份 ...