关于原则orm:Symfony应用程序/控制台缓存:clear –env = prod和缓存(APC,Memcached等)?

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)?

运行此命令并检查服务器状态后,项目数和缓存占用率始终相同:

enter image description here

我的配置,其中%prod_cache%参数实际上是字符串memcache

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]

快取:清除

cache:clear命令不会清除Doctrine缓存。它仅清除某些Symfony 2框架特定的缓存,主要是app/cache(或var/cache)目录。

教义命令

为了清除教义缓存,请使用:

  • doctrine:cache:clear-metadata --env=prod
  • doctrine:cache:clear-query --env=prod
  • doctrine:cache:clear-result --env=prod

额外的缓存

如果使用其他缓存存储,则必须自己清除它们。您可以查看doctrine:cache:clear-*命令,以启发您如何创建自己的命令。

但是在查看配置时,您将单个缓存存储区用于3个Doctrine缓存和Symfony Validator缓存。因此,仅调用doctrine:cache:clear-*之一应清除所有内容。

题外话

当使用诸如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