appRoot = $appRoot; $this->configurationManager = $configurationManager; parent::__construct(); } /** * {@inheritdoc} */ protected function configure() { $this ->setName('server') ->setDescription($this->trans('commands.server.description')) ->addArgument( 'address', InputArgument::OPTIONAL, $this->trans('commands.server.arguments.address'), '127.0.0.1:8088' ); } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { $io = new DrupalStyle($input, $output); $address = $this->validatePort($input->getArgument('address')); $finder = new PhpExecutableFinder(); if (false === $binary = $finder->find()) { $io->error($this->trans('commands.server.errors.binary')); return 1; } $router = $this->getRouterPath(); $processBuilder = new ProcessBuilder([$binary, '-S', $address, $router]); $processBuilder->setTimeout(null); $processBuilder->setWorkingDirectory($this->appRoot); $process = $processBuilder->getProcess(); $io->success( sprintf( $this->trans('commands.server.messages.executing'), $binary ) ); $io->commentBlock( sprintf( $this->trans('commands.server.messages.listening'), 'http://'.$address ) ); // Use the process helper to copy process output to console output. $this->getHelper('process')->run($output, $process, null, null); if (!$process->isSuccessful()) { $io->error($process->getErrorOutput()); return 1; } return 0; } /** * @return null|string */ private function getRouterPath() { $routerPath = [ sprintf( '%s/.console/router.php', $this->configurationManager->getHomeDirectory() ), sprintf( '%s/console/router.php', $this->configurationManager->getApplicationDirectory() ), sprintf( '%s/%s/config/dist/router.php', $this->configurationManager->getApplicationDirectory(), DRUPAL_CONSOLE_CORE ) ]; foreach ($routerPath as $router) { if (file_exists($router)) { return $router; } } return null; } /** * @param string $address * @return string */ private function validatePort($address) { if (false === strpos($address, ':')) { $host = $address; $port = '8088'; } else { $host = explode(':', $address)[0]; $port = explode(':', $address)[1]; } if (fsockopen($host, $port)) { $port = rand(8888, 9999); $address = sprintf( '%s:%s', $host, $port ); $address = $this->validatePort($address); } return $address; } }