我在 Symfony 2 应用程序中的一个 bundle 有一个自定义缓存预热器。
当从控制台运行并处于开发模式时,它会向标准输出写入一条通知,表明它已被调用。
有时,并非总是如此,它会为单个控制台缓存多次调用:clear 命令,多个通知被写入标准输出就是明证。
有人可以解释为什么会这样吗?正常吗?所有的缓存预热器都调用了多次吗?
环境:
- Ubuntu 14.04.3
- PHP 7.0.2-4
- 交响乐 2.7.9
------ 编辑 21-Feb-2016 08:36 ------
由于各种原因(大小、NDA 等),按实际来源发布是不切实际的。因此,我创建了一个带有缓存预热器的小包,它在调用时仅回显其类名。
正如您在下面的输出中看到的,它被调用了两次。
//
// 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()
最佳答案
单次执行 console cache:clear
可以触发缓存预热0 到 3 次,具体取决于以下因素:
- 缓存的当前状态,
- 可选参数(例如
--no-warmup
和--no-optional-warmers
), - 缓存预热器是否可选(根据
isOptional()
方法)。
一点介绍:Symfony 使用名为 cache_warmer
的服务,它映射到 Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate
类。它用于聚合所有已注册的带有 kernel.cache_warmer
标记的缓存预热服务,并提供方便的方法来执行它们。
有两种方法可以在 console cache:clear
调用期间显式启动缓存预热:
Symfony\Component\HttpKernel\Kernel::initializeContainer()
- 在每次内核初始化时执行,无论是在控制台还是网络模式下。如果您没有热缓存,它会触发非可选缓存预热器。Symfony\Bundle\FrameworkBundle\Command\CacheClearCommand::warmup()
- 由console cache:clear
命令执行。它根据使用的选项触发所有或仅可选的加热器。 但更重要的是,它实际上通过$this->getTempKernel()
创建了一个临时内核,它还会在初始化期间触发非可选缓存预热器(如上一点)。
这会让您对每个缓存预热服务进行 0-3 次调用。基于 Symfony v2.8.3。
附言出于好奇,我只花了 2 个小时来挖掘 Symfony 代码 ;)
关于php - 为什么我的 Symfony 2 缓存暖机被多次调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35510714/