分析easyswoole3.0源码,服务启动为例

Posted gavinjunftd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分析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

1 //如果是 php easyswoole start produce的指令,就是生产环境,会加载 produce.env
2 if(in_array(produce,$commandList)){
3     EasySwooleEasySwooleCore::getInstance()->setIsDev(false);
4 }
5 EasySwooleEasySwooleCore::getInstance()->initialize();
6 //这个代码需要跳入 EasySwooleEasySwooleCore::45 

跳入EasySwooleEasySwooleCore::45

//检查全局文件是否存在.
$file = EASYSWOOLE_ROOT . /EasySwooleEvent.php;
if(file_exists($file)){
    require_once $file;
    try{
    $ref = new ReflectionClass(EasySwooleEasySwooleEasySwooleEvent);
    if(!$ref->implementsInterface(Event::class)){
        die(global file for EasySwooleEvent is not compatible for EasySwooleEasySwooleEasySwooleEvent);
    }
    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

1 $conf = EasySwooleEasySwooleConfig::getInstance();//获取配置的内容
2 //是否含有d或者daemonize(示例 php easyswoole start d)指令,如果有,则服务设置为daemonize模式
3 if(in_array("d",$commandList) || in_array("daemonize",$commandList)){
4     $conf->setConf("MAIN_SERVER.SETTING.daemonize", true);
5 }
6 
7 //创建主服务
8 EasySwooleEasySwooleCore::getInstance()->createServer();
9 跳入EasySwooleEasySwooleCore::74
跳入EasySwooleEasySwooleCore::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服务
EasySwooleEasySwooleCore::getInstance()->start();

对比之前分析的2.0流程上其实差别不大。就是再读一遍比起2.0要清晰很多。



 

 





以上是关于分析easyswoole3.0源码,服务启动为例的主要内容,如果未能解决你的问题,请参考以下文章

微服务架构 *2.3 Spring Cloud 启动及加载配置文件源码分析(以 Nacos 为例)

分析easyswoole源码

uboot启动源码分析

第四章 Leader选举算法分析

技术汪丨MVC初级知识之启动流程(以近乎产品源码为例)

Kafka 3.0 源码笔记-Kafka 服务端的启动与请求处理源码分析