当前位置: 首页 > 后端技术 > PHP

基于swoole框架的hyperf源码分析(二)

时间:2023-03-29 23:21:42 PHP

phpbin/hyperf.php开始查看命令的作用。该类的执行方法定义在Hyperf\Server\Command类中。protectedfunctionexecute(InputInterface$input,OutputInterface$output){//先检查环境$this->checkEnvironment($output);//为服务设置日志类,事件分发器$serverFactory=$this->container->get(ServerFactory::class)->setEventDispatcher($this->container->get(EventDispatcherInterface::class))->setLogger($this->container->get(StdoutLoggerInterface::class));$serverConfig=$this->container->get(ConfigInterface::class)->get('server',[]);if(!$serverConfig){thrownewInvalidArgumentException('至少应该定义一个服务器。');}$serverFactory->configure($serverConfig);Runtime::enableCoroutine(true,swoole_hook_flags());$serverFactory->start();}取出配置文件中所有的server.php和servers,并启动相应的服务。第一种是直接newswoole,后者是通过addListener添加的。同名的服务器名会覆盖之前的foreach($serversas$server){$name=$server->getName();$type=$server->getType();$host=$server->getHost();$port=$server->getPort();$sockType=$server->getSockType();$callbacks=$server->getCallbacks();if(!$this->serverinstanceofSwooleServer){$this->server=$this->makeServer($type,$host,$port,$config->getMode(),$sockType);$callbacks=array_replace($this->defaultCallbacks(),$config->getCallbacks(),$callbacks);$this->registerSwooleEvents($this->server,$callbacks,$name);$this->server->set(array_replace($config->getSettings(),$server->getSettings()));ServerManager::add($name,[$type,current($this->server->ports)]);if(class_exists(BeforeMainServerStart::class)){//触发BeforeMainServerStart事件,该事件只在主服务器启动前触发一次。$this->eventDispatcher->dispatch(newBeforeMainServerStart($this->server,$config->toArray()));}}else{/**@var\Swoole\Server\Port$slaveServer*/$slaveServer=$this->server->addlistener($host,$port,$sockType);if(!$slaveServer){thrownew\RuntimeException("无法监听服务器端口[{$host}:{$port}]");$server->getSettings()&&$slaveServer->set($server->getSettings());$this->registerSwooleEvents($slaveServer,$callbacks,$name);ServerManager::add($name,[$type,$slaveServer]);}//触发beforeStart事件。如果(isset($callbacks[SwooleEvent::ON_BEFORE_START])){[$class,$method]=$callbacks[SwooleEvent::ON_BEFORE_START];如果($this->container->has($class)){$this->container->get($class)->{$method}();}}if(class_exists(BeforeServerStart::class)){//触发BeforeEventStart事件。$this->eventDispatcher->dispatch(newBeforeServerStart($name));}}注册事件时,路由和中间件会被添加到对应的事件处理方法中}publicfunctioninitCoreMiddleware(string$serverName):void{$this->serverName=$serverName;//注册中间件$this->coreMiddleware=$this->createCoreMiddleware();//注册路由分发器$this->routerDispatcher=$this->createDispatcher($serverName);$config=$this->container->get(ConfigInterface::class);$this->中间件=$config->get(“中间件。”.$服务器名,[]);$this->exceptionHandlers=$config->get('exceptions.handler.'.$serverName,$this->getDefaultExceptionHandler());}路由使用的是nikic/Fast-routeRoutingComponentPartII重点介绍aop实现