diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/ServerRunCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/ServerRunCommand.php index 462ff09ca5..78468a5b7e 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/ServerRunCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/ServerRunCommand.php @@ -95,16 +95,29 @@ EOF } $env = $this->getContainer()->getParameter('kernel.environment'); + $address = $input->getArgument('address'); + + if (false === strpos($address, ':')) { + $output->writeln('The address has to be of the form bind-address:port.'); + + return 1; + } + + if ($this->isOtherServerProcessRunning($address)) { + $output->writeln(sprintf('A process is already listening on http://%s.', $address)); + + return 1; + } if ('prod' === $env) { $output->writeln('Running PHP built-in server in production environment is NOT recommended!'); } - if (null === $builder = $this->createPhpProcessBuilder($input, $output, $env)) { + if (null === $builder = $this->createPhpProcessBuilder($output, $address, $input->getOption('router'), $env)) { return 1; } - $output->writeln(sprintf("Server running on http://%s\n", $input->getArgument('address'))); + $output->writeln(sprintf("Server running on http://%s\n", $address)); $output->writeln('Quit the server with CONTROL-C.'); $builder->setWorkingDirectory($documentRoot); @@ -127,9 +140,24 @@ EOF return $process->getExitCode(); } - private function createPhpProcessBuilder(InputInterface $input, OutputInterface $output, $env) + private function isOtherServerProcessRunning($address) { - $router = $input->getOption('router') ?: $this + list($hostname, $port) = explode(':', $address); + + $fp = @fsockopen($hostname, $port, $errno, $errstr, 5); + + if (false !== $fp) { + fclose($fp); + + return true; + } + + return false; + } + + private function createPhpProcessBuilder(OutputInterface $output, $address, $router, $env) + { + $router = $router ?: $this ->getContainer() ->get('kernel') ->locateResource(sprintf('@FrameworkBundle/Resources/config/router_%s.php', $env)) @@ -150,6 +178,6 @@ EOF return; } - return new ProcessBuilder(array($binary, '-S', $input->getArgument('address'), $router)); + return new ProcessBuilder(array($binary, '-S', $address, $router)); } }