前文鏈接,閱讀的時候最好參照EasySwoole2.1.2的源碼php
$inst->run();//啓動服務
這裏實際調用的是Core的start方法ServerManager::getInstance()->start();html
這個方法主要是啓動swoole服務的web
//建立主服務 $this->createMainServer();
在這塊代碼裏主要是核心,是在swoole執行start服務前設置相關配置以及配置相關回調函數。具體代碼以下數組
先給服務器配置相關運行參數服務器
$conf = Config::getInstance()->getConf("MAIN_SERVER");//獲取Config.php 中配置的MAIN_SERVER數組 $runModel = $conf['RUN_MODEL'];//獲取運行模式 默認是SWOOLE_PROCESS模式,使用進程模式,業務代碼在Worker進程中執行 $host = $conf['HOST'];//獲取運行的host 'HOST'=>'0.0.0.0', $port = $conf['PORT'];//獲取配置的運行端口爲9501 'PORT'=>9501, $setting = $conf['SETTING'];//這裏設置的相關的配置項,這些配置作一些解釋,參照https://wiki.swoole.com/wiki/page/274.html 'SETTING'=>[ 'task_worker_num' => 8, //配置Task進程的數量,配置此參數後將會啓用task功能。因此Server務必要註冊onTask、onFinish2個事件回調函數。若是沒有註冊,服務器程序將沒法啓動。 'task_max_request'=>10,//設置task進程的最大任務數。一個task進程在處理完超過此數值的任務後將自動退出。這個參數是爲了防止PHP進程內存溢出。若是不但願進程自動退出能夠設置爲0,炒雞重要,進程中的數據,若是有一個global數組,或者全局變量,不設置這個就會不回收最終致使內存溢出 'max_request'=>5000,//設置worker進程的最大任務數,這個和task_max_request功能同樣,爲了解決PHP進程內存溢出問題 'worker_num'=>8//設置啓動的Worker進程數 ], //其實這裏還有2個配置,是前文中提到的,在前文19行$this->sysDirectoryInit();會初始化配置pid_file和log_file pid_file //在Server啓動時自動將master進程的PID寫入到文件,在Server關閉時自動刪除PID文件。 log_file //指定swoole錯誤日誌文件。在swoole運行期發生的異常信息會記錄到這個文件中。默認會打印到屏幕。 $sockType = $conf['SOCK_TYPE'];//指定當前運行的服務是什麼服務器。有tcp服務,http服務,websocket服務。默認是tcp服務 switch ($conf['SERVER_TYPE']){ case self::TYPE_SERVER:{ $this->mainServer = new \swoole_server($host,$port,$runModel,$sockType);//建立mainServer,這裏建立了一個tcp服務器 break; } case self::TYPE_WEB_SERVER:{ $this->mainServer = new \swoole_http_server($host,$port,$runModel,$sockType);//web方式是默認 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);//將上面的相關服務啓動配置到mainServer
建立默認的事件註冊器,給服務註冊默認的是事件處理函數websocket
$register = new EventRegister(); $this->finalHook($register); EasySwooleEvent::mainServerCreate($this,$register);//這裏是框架全局事件mainServerCreate主服務建立事件 $events = $register->all(); //而後循環給swoole服務器綁定回調函數。這裏同一個回調方法設置多個回調函數 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); }); }
這裏提一下finalHook具體作了什麼操做swoole
$this->finalHook($register);
//實例化對象池管理 PoolManager::getInstance(); //register,先綁定一個workerStart回調函數。此事件在Worker進程/Task進程啓動時發生。這裏建立的對象能夠在進程全局週期內使用。 $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)){//判斷當前是不是worker進程 $name = "{$name}_Worker_".$workerId; }else{//這個是task進程 $name = "{$name}_Task_Worker_".$workerId; } cli_set_process_title($name);//設置當前的進程名稱 //圖片 } }); //EventHelper 是一個框架提供的默認的事件處理函數(這些放到後面具體講述) EventHelper::registerDefaultOnTask($register);//註冊默認的task回調,處理task任務的具體函數 EventHelper::registerDefaultOnFinish($register);//註冊默認的task任務完成後的回調 EventHelper::registerDefaultOnPipeMessage($register);//註冊pipeMessage回調函數 $conf = Config::getInstance()->getConf("MAIN_SERVER"); //若是是http服務器或者websocket,須要註冊request回調函數 if($conf['SERVER_TYPE'] == self::TYPE_WEB_SERVER || $conf['SERVER_TYPE'] == self::TYPE_WEB_SOCKET_SERVER){ if(!$register->get($register::onRequest)){ EventHelper::registerDefaultOnRequest($register);//這裏包含了請求,而後路由解析,處理返回的功能。就跟通常web框架相似 } }
系統啓動後,在worker啓動的時候,會進行更名的操做,以下圖框架
最後註冊相關的cache監聽端口等就啓動swoole服務了。socket
Cache::getInstance(); //這裏註冊Cache Cluster::getInstance()->run(); //實現RPC CronTab::getInstance()->run(); //定時任務 $this->attachListener();//Swoole提供了swoole_server::addListener來增長監聽的端口。業務代碼中能夠經過調用swoole_server::connection_info來獲取某個鏈接來自於哪一個端口。這裏框架啓動的時候host配置的是0.0.0.0 因此監聽全部地址,就不必設置這個了 $this->isStart = true; $this->getServer()->start();//啓動swoole服務器,在這以前建立的對象都在程序全局期中
下篇文章介紹TableManager。由於它在不少地方都被用到了。 tcp