easyswoole2.X源碼解讀-服務啓動

1.框架啓動 php easyswoole start

當我們通過php easyswoole start啓動EasySwoole 服務時,命令真正到達的文件是 easyswoole項目\vendor\easyswoole\easyswoole\bin\easyswoole, serverStart($option)

2.函數serverStart($option),加載配置文件(單例conf),實例化core(單例core)

function serverStart($options)
{
    
    $conf = Conf::getInstance(); //實例化配置
    
    $inst = Core::getInstance()->initialize(); //實例化core
    
    $inst->run(); //啓動框架服務
   
}

3.核心類\easyswoole\vendor\easyswoole\easyswoole\src\Core\Core.php

Di容器保存VERSION,HTTP_CONTROLLER_MAX_DEPTH兩個常量

 public function initialize():Core
    {
        Di::getInstance()->set(SysConst::VERSION,'2.1.4');
        Di::getInstance()->set(SysConst::HTTP_CONTROLLER_MAX_DEPTH,3);
        EasySwooleEvent::frameInitialize();
        $this->errorHandle();
        return $this;
    }

4.啓動框架  

public function run():void
    {
        ServerManager::getInstance()->start();
    }

5.服務管理類 ServerManager   \easyswoole\vendor\easyswoole\easyswoole\src\Core\Swoole\ServerManager.php

public function start():void
    {
        $this->createMainServer();
        Cache::getInstance();
        Cluster::getInstance()->run();
        CronTab::getInstance()->run();
        $this->attachListener();
        $this->isStart = true;
        $this->getServer()->start();  //調用swoole_server的start方法,正式啓動Easyswoole服務
    }

5.1  創建主服務

根據配置 SERVER_TYPE 實例化不同的服務, swoole_server,swoole_http_server, swoole_websocket_server

根據配置SETTING 設置服務的set

創建默認事件註冊器 easyswoole\vendor\easyswoole\easyswoole\src\Core\Swoole\EventRegister.php, 監聽對應的事件

 

private function createMainServer():\swoole_server
    {
        $conf = Config::getInstance()->getConf("MAIN_SERVER");
        $runModel = $conf['RUN_MODEL'];
        $host = $conf['HOST'];
        $port = $conf['PORT'];
        $setting = $conf['SETTING'];
        $sockType = $conf['SOCK_TYPE'];
        switch ($conf['SERVER_TYPE']){
            case self::TYPE_SERVER:{
                $this->mainServer = new \swoole_server($host,$port,$runModel,$sockType);
                break;
            }
            case self::TYPE_WEB_SERVER:{
                $this->mainServer = new \swoole_http_server($host,$port,$runModel,$sockType);
                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);
        //創建默認的事件註冊器
        $register = new EventRegister();
        $this->finalHook($register);
        EasySwooleEvent::mainServerCreate($this,$register);
        $events = $register->all();
        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);
            });
        }
        return $this->mainServer;
    }

通過EventHelper類,註冊默認的回調函數  \easyswoole\vendor\easyswoole\easyswoole\src\Core\Swoole\EventHelper.php 

private function finalHook(EventRegister $register)
    {
        //實例化對象池管理
        PoolManager::getInstance();
        $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)){
                    $name = "{$name}_Worker_".$workerId;
                }else{
                    $name = "{$name}_Task_Worker_".$workerId;
                }
                cli_set_process_title($name);
            }
        });
        EventHelper::registerDefaultOnTask($register);
        EventHelper::registerDefaultOnFinish($register);
        EventHelper::registerDefaultOnPipeMessage($register);
        $conf = Config::getInstance()->getConf("MAIN_SERVER");
        if($conf['SERVER_TYPE'] == self::TYPE_WEB_SERVER || $conf['SERVER_TYPE'] == self::TYPE_WEB_SOCKET_SERVER){
            if(!$register->get($register::onRequest)){
                EventHelper::registerDefaultOnRequest($register);
            }
        }
    }

5.2 增加多端口監聽功能,通過adServer添加的服務

private function attachListener():void
    {
        $mainServer = $this->getServer();
        foreach ($this->serverList as $serverName => $server){
            $subPort = $mainServer->addlistener($server['host'],$server['port'],$server['type']);
            if($subPort){
                $this->serverList[$serverName] = $subPort;
                if(is_array($server['setting'])){
                    $subPort->set($server['setting']);
                }
                $events = $server['eventRegister']->all();
                foreach ($events as $event => $callback){
                    $subPort->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);
                    });
                }
            }else{
                Trigger::throwable(new \Exception("addListener with server name:{$serverName} at host:{$server['host']} port:{$server['port']} fail"));
            }
        }
    }
public function addServer(string $serverName,int $port,int $type = SWOOLE_TCP,string $host = '0.0.0.0',array $setting = [
        "open_eof_check"=>false,
    ]):EventRegister
    {
        $eventRegister = new EventRegister();
        $this->serverList[$serverName] = [
            'port'=>$port,
            'host'=>$host,
            'type'=>$type,
            'setting'=>$setting,
            'eventRegister'=>$eventRegister
        ];
        return $eventRegister;
    }

5.3 實例化cache (基於swoole_tabel) ,cronTab,cluster 功能

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章