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));
}
}