以下内容需要结合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源码,服务启动为例(二)的更多相关文章

  1. 分析easyswoole3.0源码,服务启动为例(一)

    swoole已经升级到4了,主要的特性是更好的支持协程,easyswoole也为了更好支持协程推出了es3.我本地环境是php7.2.9 centos7 在github下载最新的3.0的demo.地址 ...

  2. 分析easyswoole3.0源码,consoleTcpService(六)

    前文讲过可以通过配置开启一个tcp服务,叫做consoleTcpservice.EasySwoole\EasySwoole\Core::83行 (new TcpService(Config::getI ...

  3. 分析easyswoole3.0源码,体验es3(三)

    demo在手,总得去试试看效果吧.我们先把默认的服务改成webserver,并且添加数据库的配置. 建立数据库,github里面有相关内容 CREATE TABLE `user_list` ( `us ...

  4. 分析easyswoole3.0源码,协程连接池(五)

    连接池的含义,很多都知道,比如mysql的数据库连接是有限的,一开始连接mysql创建N个连接,放到一个容器里,每次有请求去容器中取出,取出用完再放回去. es3demo里,有mysql的连接池. E ...

  5. 分析easyswoole3.0源码,Trace组件(四)

    前文,我们访问地址的时候服务端会输出类似trace信息.那么原理是什么呢?其实es3已经把这个独立出来作为单独组件了,名字叫做Trace组件 在demo里的调用原理是 EasySwooleEvent: ...

  6. Android 8.1 源码_启动篇(二) -- 深入研究 zygote(转 Android 9.0 分析)

    前言 在Android中,zygote是整个系统创建新进程的核心进程.zygote进程在内部会先启动Dalvik虚拟机,继而加载一些必要的系统资源和系统类,最后进入一种监听状态.在之后的运作中,当其他 ...

  7. Android4.0源码Launcher启动流程分析【android源码Launcher系列一】

    最近研究ICS4.0的Launcher,发现4.0和2.3有稍微点区别,但是区别不是特别大,所以我就先整理一下Launcher启动的大致流程. Launcher其实是贯彻于手机的整个系统的,时时刻刻都 ...

  8. OpenJDK1.8.0 源码解析————HashMap的实现(二)

    上一篇文章介绍了HashMap的一部分的知识,算是为下面HashMap的进一步学习做准备吧. 然后写的时候一直在思考的一个问题是,这方面的知识网上的资料也是一抓一大把,即使是这样我为什么还要花费时间去 ...

  9. WmS简介(三)之Activity窗口是如何创建的?基于Android7.0源码

    OK,在前面两篇博客中我们分别介绍了WmS中的token,同时也向小伙伴们区分了Window和窗口的区别,并且按照type值的不同将Android系统中的窗口分为了三大类,那么本篇博客我们就来看看应用 ...

随机推荐

  1. Jmeter5.1.1的汉化

    Jmeter的汉化: 在菜单导航栏,选择options-->choose language-->chinese(simplified)中文简体 默认打开汉化: 编辑jmeter.bat: ...

  2. python大法好——Python SMTP发送邮件

    Python SMTP发送邮件 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. py ...

  3. 异常:Instantiation of bean failed; nested exception is java.lang.NoSuchMethodError: com.google.common.base.Preconditions.che ckState(ZLjava/lang/String;I)V

    Instantiation of bean failed; nested exception is java.lang.NoSuchMethodError: com.google.common.bas ...

  4. C 语言能不能在头文件定义全局变量?

    可以,但一般不会将全局变量的定义写在头文件中. 因为如果多个 C 源文件都添加了头文件,很容易引起重定义的问题.这时候一般编译器都会提示:“multiple definition of... firs ...

  5. CentOS 7 用户及权限管理

    用户及组的管理: 安全上下文: 进程以其发起者的身份运行: 进程对文件的访问权限,取决于发起此进程的用户的权限 系统用户:为了能够让那些后台进程或服务类进程以非管理员的身份运行,通常需要为此创建多个普 ...

  6. Centos7下Rinetd安装与应用(转)

    Linux下做地址NAT有很多种方法.比如haproxy.nginx的4层代理,linux自带的iptables等都能实现.haproxy.nginx就不说了,配置相对简单:iptables配置复杂, ...

  7. C#下用于同时使用OpenCvSharp和Emgu.CV两个库的相互转换库

    很久以前做的一个图像处理项目,在.NET平台上使用OpenCV,但因为同时使用了C#支持的两个比较有名的库,由于封装方式不同,难免要转换两个库之间的Mat对象. 同时还封装了一些WPF下,System ...

  8. Serv-U 配置说明(虚拟路径、网络驱动器、个人文件夹,数据库管理)

    实现效果 1.用户数据存在数据库,可以自己修改. 2.支持匿名用户使用部分功能 3.每个用户均有私人文件夹,可以自己存放文件 4.FTP内主要的文件都在存储内,不存在服务器上 匿名用户访问情况: 普通 ...

  9. mybatis sql in not in的使用

    xml配置 <select id="SelectAllByNotsampleNo" resultMap="BaseResultMap" parameter ...

  10. django项目 报错:ImportError: cannot import name choice

    今天项目开发中遇到一个错误,排查了很久才发现原因,现在分享出来,希望对大家有所帮助. 错误描述:在项目中添加了一个random.py的类,导入random中的choice,并在randstr方法中使用 ...