Symfony 部署后清除缓存组件

Posted

技术标签:

【中文标题】Symfony 部署后清除缓存组件【英文标题】:Symfony clear cache component after deploy 【发布时间】:2017-05-31 12:25:45 【问题描述】:

您好,有没有办法从 symfony 缓存组件中清除所有缓存数据?

这里底部的http://symfony.com/doc/current/components/cache/cache_pools.html 是:(我需要控制台命令)

$cacheIsEmpty = $cache->clear();

和命令:

bin/console cache:clear

保持缓存不变

我正在寻找控制台命令,我可以在每次部署时调用 *.sh 脚本。

编辑(示例):

默认输入选项:

 $cache = new FilesystemAdapter();
 $defaultInputOptions = $cache->getItem('mainFilter.defaultInputOptions');

 if (!$defaultInputOptions->isHit()) 
      // collect data, format etc.
      $expiration = new \DateInterval('P1D');
      $defaultInputOptions->expiresAfter($expiration);
      $cache->save($defaultInputOptions);
  else 
      return $defaultInputOptions->get();
 

但如果我在“收集数据、格式等”中进行更改。在我的机器上然后进行部署(git pull、composer install、bin/console cache:clear...)然后服务器上的新版本仍然有有效的缓存(1天)并从中获取数据...

【问题讨论】:

为什么 ./bin/console cache:clear 还不够? 有问题的是更新 - 示例和解释。 【参考方案1】:

你可以让任何你想要的服务实现 Symfony\Component\HttpKernel\CacheClearer\CacheClearerInterface 被 symfony native cache:clear

使用
use Symfony\Component\HttpKernel\CacheClearer\CacheClearerInterface;
use Symfony\Component\Cache\Adapter\AdapterInterface;

final class SomeCacheClearer implements CacheClearerInterface

    private $cache;

    public function __construct(AdapterInterface $filesystemAdapter)
    
        $this->cache = $filesystemAdapter;
    

    public function clear($cacheDir)
    
        $this->cache->clear();
    

配置由标签 kernel.cache_clearer

完成
cache_provider.clearer:
    class: AppBundle\Path\SomeCacheClearer
    arguments:
        - 'my_app_cache'
    tags:
        -  name: kernel.cache_clearer 

编辑:关于缓存即服务的精度:

你的缓存服务可以这样定义

my_app_cache:
    class: Symfony\Component\Cache\Adapter\FilesystemAdapter

或者如果你想指定一个命名空间和 ttl

my_app_cache:
    class: Symfony\Component\Cache\Adapter\FilesystemAdapter
    arguments:
        - 'my_cache_namespace'
        - 30 #cache ttl  (in seconds)

所以你应该使用

$cache = new FilesystemAdapter();

但是使用服务注入

$cache = $this->get('my_app_cache');

【讨论】:

您好,谢谢回答。我必须添加use Symfony\Component\Cache\Adapter\AdapterInterface; 并在参数中给出@cache.app。但它不起作用 - 没有错误,在 bin/console cache:clear 之后仍然从有效缓存中加载数据 如果在方法 clear() 中放置断点或var_dump("called");exit;,它会被调用吗? 在控制台中我看到'调用'所以是的 好的,谢谢。它在 service.yaml 中没有任何参数即可工作。【参考方案2】:

最后 - 只需编辑 services.yml 并添加:

appbundle.cachecomponent.clearall:
    class: Symfony\Component\Cache\Adapter\FilesystemAdapter
    tags:
        -  name: kernel.cache_clearer 

我是 symfony 的新手,所以我希望这是正确的解决方案。

【讨论】:

以上是关于Symfony 部署后清除缓存组件的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 学说清除缓存

Symfony2 会话和缓存:清除命令

部署到heroku后如何清除rails缓存?

Symfony 5.1.3 清除缓存时的问题:尝试从命名空间加载类“MappingDriverChain”

Symfony 缓存:清除错误毁了我的整个项目

Symfony 5 缓存:清除 php.CRITICAL:致命错误:允许的内存大小