为什么我的Symfony 2缓存加热器被多次调用?

时间:2016-02-19 17:01:10

标签: php symfony caching

Symfony 2应用程序中的一个捆绑包具有自定义缓存加热器。

从控制台运行并以dev模式运行时,它会向stdout写入一条已被调用的通知。

有时,并非总是如此,对于单个控制台缓存,它被多次调用:清除命令,这可以通过写入stdout的多个通知来证明。

有人可以解释为什么会这样吗?这是正常的吗?是否所有缓存加热器都被称为多次?

环境:

  • Ubuntu 14.04.3
  • PHP 7.0.2-4
  • Symfony 2.7.9

------编辑21-Feb-2016 08:36 -------

由于各种原因(大小,NDAs等)按实际来源发帖是不切实际的。所以,我创建了一个带缓存加热器的小小包,只是在调用时回显它的类名。

正如您在下面的输出中所看到的,它被调用两次。

//
// The cache warmer.
//
namespace SoBundle\Listener;
use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;

class CacheWarmer implements CacheWarmerInterface
{
    public function isOptional()
    {
        return false;
    }

    public function warmUp( $cacheDir )
    {
        echo __CLASS__ . '()' . PHP_EOL;
    }
}

#
# The service definition.
#
services:
    so.cache_warmer:
        class: SoBundle\Listener\CacheWarmer
        tags:
            - { name: kernel.cache_warmer }

#
# Clearing the cache...
#
$ console cache:clear
Clearing the cache for the dev environment with debug true
SoBundle\Listener\CacheWarmer()
SoBundle\Listener\CacheWarmer()

1 个答案:

答案 0 :(得分:8)

单次执行console cache:clear可以触发缓存升温 0到3次,具体取决于以下因素:

  1. 当前缓存状态,
  2. 可选参数(例如--no-warmup--no-optional-warmers),
  3. 缓存加热器是否可选(根据isOptional()方法)。
  4. 一点介绍:Symfony使用名为cache_warmer的服务,该服务映射到Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate类。它用于聚合所有使用kernel.cache_warmer标记的已注册缓存加温服务,并提供了执行它们的便捷方法。

    有两种方法可以在console cache:clear调用期间明确启动缓存预热:

    1. Symfony\Component\HttpKernel\Kernel::initializeContainer() - 在每次内核初始化时执行,无论是在控制台还是Web模式下。如果您没有热缓存,它会触发非可选的缓存加热器。
    2. Symfony\Bundle\FrameworkBundle\Command\CacheClearCommand::warmup() - 由console cache:clear命令执行。它根据使用的选项触发所有或仅可选的加热器。 但更重要的是,它实际上是通过$this->getTempKernel()创建一个临时内核,它也会在初始化期间触发非可选的缓存加热器(如上所述)。
    3. 这会让你在每次缓存加温服务之间 0到3次通话。基于Symfony v2.8.3。

      P.S。出于好奇,它花了2个小时挖掘Symfony代码;)