diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.php index f252014e26..22267f0be2 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.php @@ -93,6 +93,7 @@ EOF $realCacheDir = $this->getContainer()->getParameter('kernel.cache_dir'); } + $fs = $this->filesystem; $io = new SymfonyStyle($input, $output); $kernel = $this->getApplication()->getKernel(); @@ -100,25 +101,36 @@ EOF // the old cache dir name must not be longer than the real one to avoid exceeding // the maximum length of a directory or file path within it (esp. Windows MAX_PATH) $oldCacheDir = substr($realCacheDir, 0, -1).('~' === substr($realCacheDir, -1) ? '+' : '~'); + $fs->remove($oldCacheDir); if (!is_writable($realCacheDir)) { throw new \RuntimeException(sprintf('Unable to write in the "%s" directory', $realCacheDir)); } - if ($this->filesystem->exists($oldCacheDir)) { - $this->filesystem->remove($oldCacheDir); - } - $io->comment(sprintf('Clearing the cache for the %s environment with debug %s', $kernel->getEnvironment(), var_export($kernel->isDebug(), true))); $this->cacheClearer->clear($realCacheDir); // The current event dispatcher is stale, let's not use it anymore $this->getApplication()->setDispatcher(new EventDispatcher()); - if ($input->getOption('no-warmup')) { - $this->filesystem->rename($realCacheDir, $oldCacheDir); - } else { - $this->warmupCache($input, $output, $realCacheDir, $oldCacheDir); + $containerDir = new \ReflectionObject($kernel->getContainer()); + $containerDir = basename(dirname($containerDir->getFileName())); + + // the warmup cache dir name must have the same length as the real one + // to avoid the many problems in serialized resources files + $warmupDir = substr($realCacheDir, 0, -1).('_' === substr($realCacheDir, -1) ? '-' : '_'); + + if ($output->isVerbose() && $fs->exists($warmupDir)) { + $io->comment('Clearing outdated warmup directory...'); + } + $fs->remove($warmupDir); + $fs->mkdir($warmupDir); + + if (!$input->getOption('no-warmup')) { + if ($output->isVerbose()) { + $io->comment('Warming up cache...'); + } + $this->warmup($warmupDir, $realCacheDir, !$input->getOption('no-optional-warmers')); if ($this->warning) { @trigger_error($this->warning, E_USER_DEPRECATED); @@ -127,12 +139,22 @@ EOF } } + $containerDir = $fs->exists($warmupDir.'/'.$containerDir) ? false : $containerDir; + + $fs->rename($realCacheDir, $oldCacheDir); + $fs->rename($warmupDir, $realCacheDir); + + if ($containerDir) { + $fs->rename($oldCacheDir.'/'.$containerDir, $realCacheDir.'/'.$containerDir); + touch($realCacheDir.'/'.$containerDir.'.legacy'); + } + if ($output->isVerbose()) { $io->comment('Removing old cache directory...'); } try { - $this->filesystem->remove($oldCacheDir); + $fs->remove($oldCacheDir); } catch (IOException $e) { $io->warning($e->getMessage()); } @@ -144,34 +166,6 @@ EOF $io->success(sprintf('Cache for the "%s" environment (debug=%s) was successfully cleared.', $kernel->getEnvironment(), var_export($kernel->isDebug(), true))); } - private function warmupCache(InputInterface $input, OutputInterface $output, $realCacheDir, $oldCacheDir) - { - $io = new SymfonyStyle($input, $output); - - // the warmup cache dir name must have the same length than the real one - // to avoid the many problems in serialized resources files - $realCacheDir = realpath($realCacheDir); - $warmupDir = substr($realCacheDir, 0, -1).('_' === substr($realCacheDir, -1) ? '-' : '_'); - - if ($this->filesystem->exists($warmupDir)) { - if ($output->isVerbose()) { - $io->comment('Clearing outdated warmup directory...'); - } - $this->filesystem->remove($warmupDir); - } - - if ($output->isVerbose()) { - $io->comment('Warming up cache...'); - } - $this->warmup($warmupDir, $realCacheDir, !$input->getOption('no-optional-warmers')); - - $this->filesystem->rename($realCacheDir, $oldCacheDir); - if ('\\' === DIRECTORY_SEPARATOR) { - sleep(1); // workaround for Windows PHP rename bug - } - $this->filesystem->rename($warmupDir, $realCacheDir); - } - /** * @param string $warmupDir * @param string $realCacheDir