在Symfony 3.4中清除FileSystemCache

时间:2018-09-10 09:05:10

标签: symfony caching

我使用Symfony \ Component \ Cache \ Simple \ FilesystemCache;

当我$ cache-> set $ cache-> get $ cache-> clear()等时有效 我不想使用自定义的ttl。我想清除仅通过控制台设置的缓存。

但是当我执行php bin / console cache:clear时,它并不会清除我之前使用FilesystemCache设置的缓存。

我试图用控制台清除每个池,但也不能清除$ cache。

2 个答案:

答案 0 :(得分:0)

终于可以使用AdapterInterface了

<?php
namespace Gh\GhBundle\Manager;

use Symfony\Component\Cache\Adapter\AdapterInterface;

class AppManager
{


    protected $_rootDir;
    protected $_cache;

    public function __construct($rootDir, AdapterInterface $cache)
    {
       $this->_rootDir = $rootDir;
       $this->_cache = $cache;
    }

    /**
     * 
     * Get version of this app
     * @return string
     */
    public function getVersion()
    {
        $cache = $this->_cache;
        $numVersion = $cache->getItem('stats.num_version');
        if (!$numVersion->isHit()) {
            $version = !file_exists($this->_rootDir . '/RELEASE.TXT') ? 'dev' : file_get_contents($this->_rootDir . '/RELEASE.TXT');
            $numVersion->set($version);
            $cache->save($numVersion);
        }
        return $numVersion->get();
    }

    /**
     * 
     * Get name of this app
     * @return string
     */
    public function getName()
    {
        return 'GH';
    }


}

答案 1 :(得分:0)

1。为什么会发生

Symfony的bin/console cache:clear命令仅从内核缓存目录中清除缓存,该目录默认为var/cache/{env}

创建FilesystemCache实例时,可以提供要将缓存存储为第3个参数的路径。这是FilesystemCache构造函数的签名

public function __construct(string $namespace = '', int $defaultLifetime = 0, string $directory = null)

如果不提供第三个参数,它将以sys_get_temp_dir().'/symfony-cache'结尾,在Linux上为/tmp/symfony-cache。 如您所见,它是一个不同的目录,不会被cache:clear命令清除。

2。如何修复

正确的方法

您需要创建自己的data-cache:clear命令。非常简单https://symfony.com/doc/current/console.html

在命令的execute()方法中,应实例化FilesystemCache并对其调用clear()。示例:

protected function execute(InputInterface $input, OutputInterface $output)
{
    $cache = new FilesystemCache();
    $cache->clear();
}

然后,您可以从控制台调用php bin/console data-cache:clear。 如果您决定将来再切换到其他缓存引擎(Redis,Memcached等),则只需调整该命令即可清除该缓存。

错误的方式

  

仅当您继续使用FilesystemCache而不能使用时,它将起作用   提供对实际清除的缓存的细粒度控制。

您可以通过在实例化时将第三个参数传递给FilesystemCache来将缓存存储在kernel.cache_dir中。 示例:

$cache = new FilesystemCache('', 0, $container->getParameter('kernel.cache_dir').'/data-cache');

或配置为服务时

Symfony\Component\Cache\Simple\FilesystemCache:
  arguments:
    - ''
    - 0
    - '%kernel.cache_dir%/data-cache'

这样,Symfony的cache:clear命令将为您工作,但是将这两种类型的缓存存储在同一位置并不是一个好主意。

  

如果更改某些项目文件,则可能只希望清除   /var/cache中的内核缓存,同时保持数据缓存完整,并且   反之亦然。这就是为什么我建议不要使用此解决方案!