分析easyswoole3.0源码,服务启动为例(二)
以下内容需要结合es的源码,不然可能会觉得跳跃。先描述下es启动的大致流程。es启动的时候注册异常处理函数以及加载配置文件。根据位置文件的设置选择启动哪种swoole服务。然后用一个事件注册类,注册swoole服务需要的回调函数handler。
在启动前根据配置文件是否启动consoleTcpserver子服务。其他服务可以在EasySwooleEvent::mainServerCreate中注册。es3和es2的区别,es3支持协程以及更加组件化。分为了http组件rpc组件等
根路径的执行路径其实是require ./vendor/easyswoole/easyswoole/bin/easyswoole.php
<?php require './vendor/easyswoole/easyswoole/bin/easyswoole.php';
我们查看这个文件分析start方法,vendor/easyswoole/easyswoole/bin/easyswoole.php::165
//如果是 php easyswoole start produce的指令,就是生产环境,会加载 produce.env
if(in_array('produce',$commandList)){
\EasySwoole\EasySwoole\Core::getInstance()->setIsDev(false);
}
\EasySwoole\EasySwoole\Core::getInstance()->initialize();
//这个代码需要跳入 \EasySwoole\EasySwoole\Core::45
跳入EasySwoole\EasySwoole\Core::45
//检查全局文件是否存在.
$file = EASYSWOOLE_ROOT . '/EasySwooleEvent.php';
if(file_exists($file)){
require_once $file;
try{
$ref = new \ReflectionClass('EasySwoole\EasySwoole\EasySwooleEvent');
if(!$ref->implementsInterface(Event::class)){
die('global file for EasySwooleEvent is not compatible for EasySwoole\EasySwoole\EasySwooleEvent');
}
unset($ref);
}catch (\Throwable $throwable){
die($throwable->getMessage());
}
}else{
die('global event file missing');
}
//上面的代码是为了判断EasySwooleEvent存在并且确保实现了Event::class接口
//执行框架初始化事件,demo中创建了协程数据库连接池
EasySwooleEvent::initialize();
//根据是否是生产环境加载配置文件
$this->loadEnv();
//创建临时目录,主要是记录swoole.log 和 主服务的pid
$this->sysDirectoryInit();
//注册错误回调
$this->registerErrorHandler();
回到vendor/easyswoole/easyswoole/bin/easyswoole.php::170
$conf = \EasySwoole\EasySwoole\Config::getInstance();//获取配置的内容
//是否含有d或者daemonize(示例 php easyswoole start d)指令,如果有,则服务设置为daemonize模式
if(in_array("d",$commandList) || in_array("daemonize",$commandList)){
$conf->setConf("MAIN_SERVER.SETTING.daemonize", true);
} //创建主服务
\EasySwoole\EasySwoole\Core::getInstance()->createServer();
跳入\EasySwoole\EasySwoole\Core::
跳入\EasySwoole\EasySwoole\Core::74
//获取配置的主服务的类型以及相关配置,创建swoole服务,dev.env 里服务是WEB_SOCKET_SERVER就是swoole_websocket_server形式创建的服务 $conf = Config::getInstance()->getConf('MAIN_SERVER');
ServerManager::getInstance()->createSwooleServer(
$conf['PORT'],$conf['SERVER_TYPE'],$conf['HOST'],$conf['SETTING'],$conf['RUN_MODEL'],$conf['SOCK_TYPE']
); /*下面是注册基本的时间回调,如果swoole服务是SERVER类型会注册onReceive回调事件然后回调是交由EasySwooleEvent的onReceive处理。demo中这个onReceive是空函数没有实现方法。但是如果想开启server的话这里记得补完处理逻辑
否则就注册默认的request回调,这个会调用es3的http组件(es3最大的变化就是实现了各个模块的组件化以及添加了协程),不过任何的模式都会注册task和finish,用来处理异步任务
pipe通讯是为了对task进程通信
注册默认的worker start,对work和task进程更名*/
$this->registerDefaultCallBack(ServerManager::getInstance()->getSwooleServer(),$conf['SERVER_TYPE']); //EasySwooleEvent的mainServerCreate函数中,对主服务设置其他的回调函数。示例demo中的rpc留给后面分析
EasySwooleEvent::mainServerCreate(ServerManager::getInstance()->getMainEventRegister());
/*创建主服务后,创建Tcp子服务,我们在前文已经配置了CONSOLE为enable 可以做推送日志等信息。换句话说提供了一个server来用Tcp控制服务器,可以从任意机器控制某个远程的实例*/
(new TcpService(Config::getInstance()->getConf('CONSOLE')));
之后的都是一些启动时输出相关信息
回到vendor/easyswoole/easyswoole/bin/easyswoole.php::209
//给主进程也命名然后启动swoole服务
\EasySwoole\EasySwoole\Core::getInstance()->start();
对比之前分析的2.0流程上其实差别不大。就是再读一遍比起2.0要清晰很多。
分析easyswoole3.0源码,服务启动为例(二)的更多相关文章
- 分析easyswoole3.0源码,服务启动为例(一)
swoole已经升级到4了,主要的特性是更好的支持协程,easyswoole也为了更好支持协程推出了es3.我本地环境是php7.2.9 centos7 在github下载最新的3.0的demo.地址 ...
- 分析easyswoole3.0源码,consoleTcpService(六)
前文讲过可以通过配置开启一个tcp服务,叫做consoleTcpservice.EasySwoole\EasySwoole\Core::83行 (new TcpService(Config::getI ...
- 分析easyswoole3.0源码,体验es3(三)
demo在手,总得去试试看效果吧.我们先把默认的服务改成webserver,并且添加数据库的配置. 建立数据库,github里面有相关内容 CREATE TABLE `user_list` ( `us ...
- 分析easyswoole3.0源码,协程连接池(五)
连接池的含义,很多都知道,比如mysql的数据库连接是有限的,一开始连接mysql创建N个连接,放到一个容器里,每次有请求去容器中取出,取出用完再放回去. es3demo里,有mysql的连接池. E ...
- 分析easyswoole3.0源码,Trace组件(四)
前文,我们访问地址的时候服务端会输出类似trace信息.那么原理是什么呢?其实es3已经把这个独立出来作为单独组件了,名字叫做Trace组件 在demo里的调用原理是 EasySwooleEvent: ...
- Android 8.1 源码_启动篇(二) -- 深入研究 zygote(转 Android 9.0 分析)
前言 在Android中,zygote是整个系统创建新进程的核心进程.zygote进程在内部会先启动Dalvik虚拟机,继而加载一些必要的系统资源和系统类,最后进入一种监听状态.在之后的运作中,当其他 ...
- Android4.0源码Launcher启动流程分析【android源码Launcher系列一】
最近研究ICS4.0的Launcher,发现4.0和2.3有稍微点区别,但是区别不是特别大,所以我就先整理一下Launcher启动的大致流程. Launcher其实是贯彻于手机的整个系统的,时时刻刻都 ...
- OpenJDK1.8.0 源码解析————HashMap的实现(二)
上一篇文章介绍了HashMap的一部分的知识,算是为下面HashMap的进一步学习做准备吧. 然后写的时候一直在思考的一个问题是,这方面的知识网上的资料也是一抓一大把,即使是这样我为什么还要花费时间去 ...
- WmS简介(三)之Activity窗口是如何创建的?基于Android7.0源码
OK,在前面两篇博客中我们分别介绍了WmS中的token,同时也向小伙伴们区分了Window和窗口的区别,并且按照type值的不同将Android系统中的窗口分为了三大类,那么本篇博客我们就来看看应用 ...
随机推荐
- 数据传输流程和socket简单操作
一.***C/S架构:客户端(client)/服务端(server)架构, B/S架构:浏览器(browser) / 服务端(server)架构 软件cs架构:浏览器,qq,微信,陌陌等等硬件cs架构 ...
- 0 Python学习计划
每天一小节,坚持水滴石穿. 2019-4-1 景略
- django APPEND_SLASH
#设置项是否开启URL访问地址后面不为/跳转至带有/的路径APPEND_SLASH=True
- Xilinx Zynq ZC-702 开发(02)—— 通过 Xilinx SDK 调试 Linux 应用
远程调试环境由 PC 上运行的 System Debugger(集成在 Xilinx SDK 中) 和 Zynq 板上运行的 Linux TCF Agent 共同构成, 两者通过 TCP 连接,架构图 ...
- 开源微信管家平台——JeeWx 捷微4.0 微服务版本发布,全新架构,全新UI,提供强大的图文编辑器
JeeWx捷微4.0 微服务版本发布^_^ 换代产品(全新架构,全新UI,提供强大的图文编辑器) JEEWX 从4.0版本开始,技术架构全新换代,采用微服务架构,插件式开发,每个业务模块都是独立的 ...
- Linux su命令
本人以前一直习惯直接使用root,很少使用su,前几天才发现su与su -命令是有着本质区别的! 大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令,需要root身份才能进行, ...
- CString类型与其他类型的转换
1.BSTR转CString BSTR bstr; CString cstr; cstr = (LPCTSTR)bstr; 2.Cstring 转BSTR CString cstr = _T(&qu ...
- Django中manger/QuerySet类与mysql数据库的查询
Django中的单表操作 1.精确查询 #查询的结果返回是容器Query Set的函数(Query Set模型类)# 1. all() 查询的所有的符合条件的结果,支持正向索引,支持索引切片,不 ...
- anu小程序快速入门
众所周知,微信推出小程序以来,可谓火遍大江南北,就像当前互联网兴起时,大家忙着抢域名与开私人博客一样.小程序之所以这么火,是因为微信拥有庞大的用户量,并且腾讯帮你搞定后台问题及众多功能问题(如分享,支 ...
- find、which、whereis、locate和type之间的区别
1.find find是最常用和最强大的查找命令.它能做到实时查找,精确查找,但速度慢. find的使用格式如下: #find [指定目录] [指定条件] [指定动作] 指定目录:是指所要搜索的目录和 ...