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 功能