分析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源码,服务启动为例的主要内容,如果未能解决你的问题,请参考以下文章