php bin/hyperf.php start
来看看该命令做了什么
在Hyperf\Server\Command
类定义了该类的执行方法
protected function execute(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) {
throw new InvalidArgumentException('At least one server should be defined.');
}
$serverFactory->configure($serverConfig);
Runtime::enableCoroutine(true, swoole_hook_flags());
$serverFactory->start();
}
把配置文件的server.php,servers全部取出,启动相应的服务,第一个是直接new swoole,后面的通过addListener
加入进来,同名的server名字后面的会覆盖前面的
foreach ($servers as $server) {
$name = $server->getName();
$type = $server->getType();
$host = $server->getHost();
$port = $server->getPort();
$sockType = $server->getSockType();
$callbacks = $server->getCallbacks();
if (! $this->server instanceof SwooleServer) {
$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)) {
// Trigger BeforeMainServerStart event, this event only trigger once before main server start.
$this->eventDispatcher->dispatch(new BeforeMainServerStart($this->server, $config->toArray()));
}
} else {
/** @var \Swoole\Server\Port $slaveServer */
$slaveServer = $this->server->addlistener($host, $port, $sockType);
if (! $slaveServer) {
throw new \RuntimeException("Failed to listen server port [{$host}:{$port}]");
}
$server->getSettings() && $slaveServer->set($server->getSettings());
$this->registerSwooleEvents($slaveServer, $callbacks, $name);
ServerManager::add($name, [$type, $slaveServer]);
}
// Trigger beforeStart event.
if (isset($callbacks[SwooleEvent::ON_BEFORE_START])) {
[$class, $method] = $callbacks[SwooleEvent::ON_BEFORE_START];
if ($this->container->has($class)) {
$this->container->get($class)->{$method}();
}
}
if (class_exists(BeforeServerStart::class)) {
// Trigger BeforeEventStart event.
$this->eventDispatcher->dispatch(new BeforeServerStart($name));
}
}
注册事件时,会给相应的事件处理方法加上路由和中间件
if ($class instanceof MiddlewareInitializerInterface) {
$class->initCoreMiddleware($serverName);
}
public function initCoreMiddleware(string $serverName): void
{
$this->serverName = $serverName;
//注册中间件
$this->coreMiddleware = $this->createCoreMiddleware();
//注册路由分发器
$this->routerDispatcher = $this->createDispatcher($serverName);
$config = $this->container->get(ConfigInterface::class);
$this->middlewares = $config->get('middlewares.' . $serverName, []);
$this->exceptionHandlers = $config->get('exceptions.handler.' . $serverName, $this->getDefaultExceptionHandler());
}
路由是用了nikic/fast-route
路由组件
下编重点介绍 aop实现
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。