Show a better error when the port is in use

This commit is contained in:
Diego Saint Esteben 2015-04-21 22:28:59 -03:00
parent db243627e5
commit 34e000e59a
1 changed files with 33 additions and 5 deletions

View File

@ -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 <comment>bind-address:port</comment>.');
return 1;
}
if ($this->isOtherServerProcessRunning($address)) {
$output->writeln(sprintf('<error>A process is already listening on http://%s.</error>', $address));
return 1;
}
if ('prod' === $env) {
$output->writeln('<error>Running PHP built-in server in production environment is NOT recommended!</error>');
}
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 <info>http://%s</info>\n", $input->getArgument('address')));
$output->writeln(sprintf("Server running on <info>http://%s</info>\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));
}
}