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