Dav*_*son 3 php caching symfony
我在Symfony 2应用程序中的一个捆绑包具有自定义缓存加热器.
从控制台运行并以dev模式运行时,它会向stdout写入一条已被调用的通知.
有时,并非总是如此,对于单个控制台缓存,它被多次调用:清除命令,如通过写入stdout的多个通知所证明的那样.
有人可以解释为什么会这样吗?这是正常的吗?是否所有缓存加热器都被称为多次?
环境:
------编辑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()
Run Code Online (Sandbox Code Playgroud)
单次执行console cache:clear可以触发缓存升温0到3次,具体取决于以下因素:
--no-warmup和--no-optional-warmers),isOptional()方法).一点介绍:Symfony使用一个名为service的服务cache_warmer,该服务映射到Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregateclass.它用于聚合标记的所有已注册缓存加温服务,kernel.cache_warmer并提供执行它们的便捷方法.
有两种方法可以在console cache:clear调用期间显式启动缓存预热:
Symfony\Component\HttpKernel\Kernel::initializeContainer() - 在每个内核初始化时执行,无论是在控制台还是Web模式下.如果您没有热缓存,它会触发非可选的缓存加热器.Symfony\Bundle\FrameworkBundle\Command\CacheClearCommand::warmup()- 由console cache:clear命令执行.它根据使用的选项触发所有或仅可选的加热器.但更重要的是,它实际上创建了一个临时内核,通过$this->getTempKernel()它可以在初始化期间触发非可选的缓存加热器(如上所述).这可以让你在0到3次调用每个缓存加温服务.基于Symfony v2.8.3.
PS出于好奇,它花了2个小时挖掘Symfony代码;)