Symfony app/console cache:clear --env=prod and cache (APC, Memcached, etc)?
我正在使用Memcached服务器(以及memcache PHP扩展)来缓存验证器元数据和Doctrine metatada / result / query缓存驱动程序。
一切都按预期工作,并且比文件系统缓存快。
我的问题是,命令是否:
1 | php app/console cache:clear --env=prod --no-debug |
自动清除所有类型的缓存(包括memcache)?
运行此命令并检查服务器状态后,项目数和缓存占用率始终相同:
我的配置,其中%prod_cache%参数实际上是字符串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | # Framework Configuration framework: validation: cache: %prod_cache% # Matches validator cache service # Doctrine Configuration doctrine: orm: metadata_cache_driver: type: service id: cache_%prod_cache% result_cache_driver: type: service id: cache_%prod_cache% query_cache_driver: type: service id: cache_%prod_cache% # DoctrineCacheBundle Configuration doctrine_cache: providers: memcache: type: memcache alias: cache_memcache # Services services: validator.mapping.cache.memcache: # Validator cache service class: Symfony\\Component\\Validator\\Mapping\\Cache\\DoctrineCache arguments: [@cache_memcache] |
快取:清除
教义命令
为了清除教义缓存,请使用:
-
doctrine:cache:clear-metadata --env=prod -
doctrine:cache:clear-query --env=prod -
doctrine:cache:clear-result --env=prod
额外的缓存
如果使用其他缓存存储,则必须自己清除它们。您可以查看
但是在查看配置时,您将单个缓存存储区用于3个Doctrine缓存和Symfony Validator缓存。因此,仅调用
题外话
当使用诸如APC,OPcache之类的缓存系统时,您必须了解从命令行运行PHP脚本时,与从Web服务器运行PHP脚本时会使用不同的内存空间。
换句话说:当您从命令行清除此类缓存时,Web服务器使用的缓存不受影响。为了清除Web服务器缓存,您需要从Web服务器本身运行缓存清除脚本。
对于memcached而言,这不是问题,因为它是管理自己的内存空间的独立程序。
您必须自己从文档(SF 2.5)中清除外部缓存:
There may be lots of other things that you need to do, depending on
your setup:
[...] Clearing your APC cache
请参阅:http://symfony.com/doc/current/cookbook/deployment/tools.html#e-other-things
此命令不会清除Memcache,因为它是一个独立的分布式内存缓存器。
它仅清除Symfony缓存。
要清除内存缓存,您必须手动运行:
1 | echo 'flush_all' | nc localhost 11211 |
但是我想你已经知道了。
clear:cache命令仅清空文件系统中的symfony缓存,然后对其进行预热。
您可以使用一些其他捆绑包来清除其他缓存:
记忆快取:https://github.com/LeaseWeb/LswMemcacheBundle
APC:https://github.com/ornicar/ApcBundle
如果您使用像APC这样的缓存,它为控制台和Web服务器使用了不同的内存空间,那么您将没有其他理由和需要手动清除缓存的接口。
对于memcache,memcached等,您可以通过在kernel.cache_clearer事件上创建侦听器来挂接cache:clear命令,该事件同时运行两个学说的cache clear命令。
无论您使用哪种方法清除缓存,某些缓存类型(如memcache)都不会释放所使用的内存。取而代之的是,下一次在该键上发出get命令时,或者当内存已满并且需要收回某些键时,它们将取消设置键。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | class CacheClearDoctrineListener implements CacheClearerInterface { /** * @var ContainerInterface */ protected $container; protected $environment; public function setContainer(ContainerInterface $container = null) { $this->container = $container; $this->environment = $container->get('kernel')->getEnvironment(); } public function clear($cacheDir) { $this->clearCacheMetadata(); $this->clearCacheQuery(); } protected function clearCacheMetadata() { // clear cache metadata $application = new Application($this->container->get('kernel')); $application->setAutoExit(false); $output = new ConsoleOutput(); $arguments = array( "command" =>"doctrine:cache:clear-metadata", "--env" => $this->environment ); $input = new ArrayInput($arguments); $returnCode = $application->run($input, $output); if ($returnCode != 0) { $output->writeln(json_decode(rtrim($output))); } } protected function clearCacheQuery() { // clear cache query $application = new Application($this->container->get('kernel')); $application->setAutoExit(false); $output = new ConsoleOutput(); $arguments = array( "command" =>"doctrine:cache:clear-query", "--env" => $this->environment ); $input = new ArrayInput($arguments); $returnCode = $application->run($input, $output); if ($returnCode != 0) { $output->writeln(json_decode(rtrim($output))); } } } |
声明您的服务,如下所示:
1 2 3 4 5 6 | <service id="cache_clear_doctrine_clearer" class="%namespace_of_your_listener%"> <call method="setContainer"> </call> <tag name="kernel.cache_clearer" priority="254" /> </service> |
如果检查vendor / symfony / src / Symfony / Bundle / FrameworkBundle / Command / CacheClearCommand.php,您将看到Symfony使用文件系统服务清除了缓存。它通过删除旧目录来清除缓存。
这是确切的功能(Symfony 2.4)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | protected function execute(InputInterface $input, OutputInterface $output) { $realCacheDir = $this->getContainer()->getParameter('kernel.cache_dir'); $oldCacheDir = $realCacheDir.'_old'; $filesystem = $this->getContainer()->get('filesystem'); if (!is_writable($realCacheDir)) { throw new \ untimeException(sprintf('Unable to write in the"%s" directory', $realCacheDir)); } if ($filesystem->exists($oldCacheDir)) { $filesystem->remove($oldCacheDir); } $kernel = $this->getContainer()->get('kernel'); $output->writeln(sprintf('Clearing the cache for the <info>%s</info> environment with debug <info>%s</info>', $kernel->getEnvironment(), var_export($kernel->isDebug(), true))); $this->getContainer()->get('cache_clearer')->clear($realCacheDir); if ($input->getOption('no-warmup')) { $filesystem->rename($realCacheDir, $oldCacheDir); } else { // the warmup cache dir name must have the same length than the real one // to avoid the many problems in serialized resources files $warmupDir = substr($realCacheDir, 0, -1).'_'; if ($filesystem->exists($warmupDir)) { $filesystem->remove($warmupDir); } $this->warmup($warmupDir, $realCacheDir, !$input->getOption('no-optional-warmers')); $filesystem->rename($realCacheDir, $oldCacheDir); if (defined('PHP_WINDOWS_VERSION_BUILD')) { sleep(1); // workaround for Windows PHP rename bug } $filesystem->rename($warmupDir, $realCacheDir); } $filesystem->remove($oldCacheDir); } |
试试这个:
1 | php app/console memcached:clear --clearAll default |