예제 #1
0
 /**
  * Bootstrap a server from command line options
  *
  * @param \Aerys\Logger $logger
  * @param \Aerys\Console $console
  * @return \Aerys\Server
  */
 public function boot(Logger $logger, Console $console) : Server
 {
     $configFile = $this->selectConfigFile((string) $console->getArg("config"));
     $logger->info("Using config file found at {$configFile}");
     if (!(include $configFile)) {
         throw new \DomainException("Config file inclusion failure: {$configFile}");
     } elseif (!defined("AERYS_OPTIONS")) {
         $options = [];
     } elseif (is_array(AERYS_OPTIONS)) {
         $options = AERYS_OPTIONS;
     } else {
         throw new \DomainException("Invalid AERYS_OPTIONS constant: array expected, got " . gettype(AERYS_OPTIONS));
     }
     if ($console->isArgDefined("debug")) {
         $options["debug"] = true;
     }
     $options = $this->generateOptionsObjFromArray($options);
     $vhosts = new VhostContainer();
     $ticker = new Ticker($logger);
     $server = new Server($options, $vhosts, $logger, $ticker);
     $bootLoader = function (Bootable $bootable) use($server, $logger) {
         return $bootable->boot($server, $logger);
     };
     $hosts = \call_user_func($this->hostAggregator) ?: [new Host()];
     foreach ($hosts as $host) {
         $vhost = $this->buildVhost($host, $bootLoader);
         $vhosts->use($vhost);
     }
     return $server;
 }
예제 #2
0
 /**
  * Bootstrap a server from command line options
  *
  * @param \Aerys\Logger $logger
  * @param \Aerys\Console $console
  * @return \Generator
  */
 public function boot(Logger $logger, Console $console) : \Generator
 {
     $configFile = self::selectConfigFile((string) $console->getArg("config"));
     $logger->info("Using config file found at {$configFile}");
     // may return Promise or Generator for async I/O inside config file
     $returnValue = (include $configFile);
     if (!$returnValue) {
         throw new \DomainException("Config file inclusion failure: {$configFile}");
     }
     if (is_callable($returnValue)) {
         $returnValue = \call_user_func($returnValue);
     }
     if ($returnValue instanceof \Generator) {
         yield from $returnValue;
     } elseif ($returnValue instanceof Promise) {
         (yield $returnValue);
     }
     if (!defined("AERYS_OPTIONS")) {
         $options = [];
     } elseif (is_array(AERYS_OPTIONS)) {
         $options = AERYS_OPTIONS;
     } else {
         throw new \DomainException("Invalid AERYS_OPTIONS constant: expected array, got " . gettype(AERYS_OPTIONS));
     }
     if ($console->isArgDefined("debug")) {
         $options["debug"] = true;
     }
     $options["configPath"] = $configFile;
     $options = $this->generateOptionsObjFromArray($options);
     $vhosts = new VhostContainer();
     $ticker = new Ticker($logger);
     $server = new Server($options, $vhosts, $logger, $ticker, [new Http1Driver(), new Http2Driver()]);
     $bootLoader = function (Bootable $bootable) use($server, $logger) {
         $booted = $bootable->boot($server, $logger);
         if ($booted !== null && !$booted instanceof Middleware && !is_callable($booted)) {
             throw new \InvalidArgumentException("Any return value of " . get_class($bootable) . '::boot() must return an instance of Aerys\\Middleware and/or be callable, got ' . gettype($booted) . ".");
         }
         return $booted ?? $bootable;
     };
     $hosts = \call_user_func($this->hostAggregator) ?: [new Host()];
     foreach ($hosts as $host) {
         $vhost = self::buildVhost($host, $bootLoader);
         $vhosts->use($vhost);
     }
     return $server;
 }