From 2e14b6e89126210a9b0e3afe5a056f035d33bb6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Sch=C3=A4dlich?= Date: Fri, 26 Apr 2019 21:24:13 +0200 Subject: [PATCH] [WebServerBundle] Change the default pidfile location to cache directory --- .../Command/ServerRunCommand.php | 6 ++++-- .../Command/ServerStartCommand.php | 6 ++++-- .../Command/ServerStatusCommand.php | 11 +++++++++- .../Command/ServerStopCommand.php | 11 +++++++++- .../WebServerExtension.php | 18 +++++++++++++++++ .../Resources/config/webserver.xml | 4 ++++ .../WebServerExtensionTest.php | 20 +++++++++++++++++++ .../Bundle/WebServerBundle/WebServer.php | 9 ++++++++- 8 files changed, 78 insertions(+), 7 deletions(-) diff --git a/src/Symfony/Bundle/WebServerBundle/Command/ServerRunCommand.php b/src/Symfony/Bundle/WebServerBundle/Command/ServerRunCommand.php index de5a8c5b3c5f..e306a65925f8 100644 --- a/src/Symfony/Bundle/WebServerBundle/Command/ServerRunCommand.php +++ b/src/Symfony/Bundle/WebServerBundle/Command/ServerRunCommand.php @@ -31,13 +31,15 @@ class ServerRunCommand extends Command { private $documentRoot; private $environment; + private $pidFileDirectory; protected static $defaultName = 'server:run'; - public function __construct(string $documentRoot = null, string $environment = null) + public function __construct(string $documentRoot = null, string $environment = null, string $pidFileDirectory = null) { $this->documentRoot = $documentRoot; $this->environment = $environment; + $this->pidFileDirectory = $pidFileDirectory; parent::__construct(); } @@ -129,7 +131,7 @@ protected function execute(InputInterface $input, OutputInterface $output) } try { - $server = new WebServer(); + $server = new WebServer($this->pidFileDirectory); $config = new WebServerConfig($documentRoot, $env, $input->getArgument('addressport'), $input->getOption('router')); $message = sprintf('Server listening on http://%s', $config->getAddress()); diff --git a/src/Symfony/Bundle/WebServerBundle/Command/ServerStartCommand.php b/src/Symfony/Bundle/WebServerBundle/Command/ServerStartCommand.php index 55bf7a7c650c..c481856b291b 100644 --- a/src/Symfony/Bundle/WebServerBundle/Command/ServerStartCommand.php +++ b/src/Symfony/Bundle/WebServerBundle/Command/ServerStartCommand.php @@ -31,13 +31,15 @@ class ServerStartCommand extends Command { private $documentRoot; private $environment; + private $pidFileDirectory; protected static $defaultName = 'server:start'; - public function __construct(string $documentRoot = null, string $environment = null) + public function __construct(string $documentRoot = null, string $environment = null, string $pidFileDirectory = null) { $this->documentRoot = $documentRoot; $this->environment = $environment; + $this->pidFileDirectory = $pidFileDirectory; parent::__construct(); } @@ -133,7 +135,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $this->getApplication()->setDispatcher(new EventDispatcher()); try { - $server = new WebServer(); + $server = new WebServer($this->pidFileDirectory); if ($server->isRunning($input->getOption('pidfile'))) { $io->error(sprintf('The web server has already been started. It is currently listening on http://%s. Please stop the web server before you try to start it again.', $server->getAddress($input->getOption('pidfile')))); diff --git a/src/Symfony/Bundle/WebServerBundle/Command/ServerStatusCommand.php b/src/Symfony/Bundle/WebServerBundle/Command/ServerStatusCommand.php index 95e8122a2d31..bedb31a67846 100644 --- a/src/Symfony/Bundle/WebServerBundle/Command/ServerStatusCommand.php +++ b/src/Symfony/Bundle/WebServerBundle/Command/ServerStatusCommand.php @@ -30,6 +30,15 @@ class ServerStatusCommand extends Command { protected static $defaultName = 'server:status'; + private $pidFileDirectory; + + public function __construct(string $pidFileDirectory = null) + { + $this->pidFileDirectory = $pidFileDirectory; + + parent::__construct(); + } + /** * {@inheritdoc} */ @@ -64,7 +73,7 @@ protected function configure() protected function execute(InputInterface $input, OutputInterface $output) { $io = new SymfonyStyle($input, $output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output); - $server = new WebServer(); + $server = new WebServer($this->pidFileDirectory); if ($filter = $input->getOption('filter')) { if ($server->isRunning($input->getOption('pidfile'))) { list($host, $port) = explode(':', $address = $server->getAddress($input->getOption('pidfile'))); diff --git a/src/Symfony/Bundle/WebServerBundle/Command/ServerStopCommand.php b/src/Symfony/Bundle/WebServerBundle/Command/ServerStopCommand.php index f86df7ff00fd..9287c2196c0a 100644 --- a/src/Symfony/Bundle/WebServerBundle/Command/ServerStopCommand.php +++ b/src/Symfony/Bundle/WebServerBundle/Command/ServerStopCommand.php @@ -28,6 +28,15 @@ class ServerStopCommand extends Command { protected static $defaultName = 'server:stop'; + private $pidFileDirectory; + + public function __construct(string $pidFileDirectory = null) + { + $this->pidFileDirectory = $pidFileDirectory; + + parent::__construct(); + } + /** * {@inheritdoc} */ @@ -55,7 +64,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $io = new SymfonyStyle($input, $output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output); try { - $server = new WebServer(); + $server = new WebServer($this->pidFileDirectory); $server->stop($input->getOption('pidfile')); $io->success('Stopped the web server.'); } catch (\Exception $e) { diff --git a/src/Symfony/Bundle/WebServerBundle/DependencyInjection/WebServerExtension.php b/src/Symfony/Bundle/WebServerBundle/DependencyInjection/WebServerExtension.php index bf08a2bac9c9..bf263e1bb654 100644 --- a/src/Symfony/Bundle/WebServerBundle/DependencyInjection/WebServerExtension.php +++ b/src/Symfony/Bundle/WebServerBundle/DependencyInjection/WebServerExtension.php @@ -31,6 +31,12 @@ public function load(array $configs, ContainerBuilder $container) $container->getDefinition('web_server.command.server_run')->replaceArgument(0, $publicDirectory); $container->getDefinition('web_server.command.server_start')->replaceArgument(0, $publicDirectory); + $pidFileDirectory = $this->getPidFileDirectory($container); + $container->getDefinition('web_server.command.server_run')->replaceArgument(2, $pidFileDirectory); + $container->getDefinition('web_server.command.server_start')->replaceArgument(2, $pidFileDirectory); + $container->getDefinition('web_server.command.server_stop')->replaceArgument(0, $pidFileDirectory); + $container->getDefinition('web_server.command.server_status')->replaceArgument(0, $pidFileDirectory); + if (!class_exists(ConsoleFormatter::class)) { $container->removeDefinition('web_server.command.server_log'); } @@ -54,4 +60,16 @@ private function getPublicDirectory(ContainerBuilder $container) return $kernelProjectDir.'/'.$publicDir; } + + private function getPidFileDirectory(ContainerBuilder $container): string + { + $kernelCacheDir = $container->getParameter('kernel.cache_dir'); + $environment = $container->getParameter('kernel.environment'); + + if (basename($kernelCacheDir) !== $environment) { + return $container->getParameter('kernel.project_dir'); + } + + return \dirname($container->getParameter('kernel.cache_dir')); + } } diff --git a/src/Symfony/Bundle/WebServerBundle/Resources/config/webserver.xml b/src/Symfony/Bundle/WebServerBundle/Resources/config/webserver.xml index 047e2cb483fe..bb76b2209899 100644 --- a/src/Symfony/Bundle/WebServerBundle/Resources/config/webserver.xml +++ b/src/Symfony/Bundle/WebServerBundle/Resources/config/webserver.xml @@ -10,20 +10,24 @@ %kernel.project_dir%/public %kernel.environment% + %kernel.project_dir%/var/cache %kernel.project_dir%/public %kernel.environment% + %kernel.project_dir%/var/cache + %kernel.project_dir%/var/cache + %kernel.project_dir%/var/cache diff --git a/src/Symfony/Bundle/WebServerBundle/Tests/DependencyInjection/WebServerExtensionTest.php b/src/Symfony/Bundle/WebServerBundle/Tests/DependencyInjection/WebServerExtensionTest.php index f52f0d2c585a..55175f0639f8 100644 --- a/src/Symfony/Bundle/WebServerBundle/Tests/DependencyInjection/WebServerExtensionTest.php +++ b/src/Symfony/Bundle/WebServerBundle/Tests/DependencyInjection/WebServerExtensionTest.php @@ -22,6 +22,8 @@ public function testLoad() { $container = new ContainerBuilder(); $container->setParameter('kernel.project_dir', __DIR__); + $container->setParameter('kernel.cache_dir', __DIR__.'/var/cache/test'); + $container->setParameter('kernel.environment', 'test'); (new WebServerExtension())->load([], $container); $this->assertSame( @@ -32,6 +34,24 @@ public function testLoad() __DIR__.'/test', $container->getDefinition('web_server.command.server_start')->getArgument(0) ); + + $this->assertSame( + __DIR__.'/var/cache', + $container->getDefinition('web_server.command.server_run')->getArgument(2) + ); + $this->assertSame( + __DIR__.'/var/cache', + $container->getDefinition('web_server.command.server_start')->getArgument(2) + ); + $this->assertSame( + __DIR__.'/var/cache', + $container->getDefinition('web_server.command.server_stop')->getArgument(0) + ); + $this->assertSame( + __DIR__.'/var/cache', + $container->getDefinition('web_server.command.server_status')->getArgument(0) + ); + $this->assertTrue($container->hasDefinition('web_server.command.server_run')); $this->assertTrue($container->hasDefinition('web_server.command.server_start')); $this->assertTrue($container->hasDefinition('web_server.command.server_stop')); diff --git a/src/Symfony/Bundle/WebServerBundle/WebServer.php b/src/Symfony/Bundle/WebServerBundle/WebServer.php index 5ea058fa2628..d23a8d8ddca8 100644 --- a/src/Symfony/Bundle/WebServerBundle/WebServer.php +++ b/src/Symfony/Bundle/WebServerBundle/WebServer.php @@ -25,6 +25,13 @@ class WebServer const STARTED = 0; const STOPPED = 1; + private $pidFileDirectory; + + public function __construct(string $pidFileDirectory = null) + { + $this->pidFileDirectory = $pidFileDirectory; + } + public function run(WebServerConfig $config, $disableOutput = true, callable $callback = null) { if ($this->isRunning()) { @@ -166,6 +173,6 @@ private function createServerProcess(WebServerConfig $config) private function getDefaultPidFile() { - return getcwd().'/.web-server-pid'; + return ($this->pidFileDirectory ?? getcwd()).'/.web-server-pid'; } }