php - 为什么我的 Symfony 2 缓存暖机被多次调用?

标签 php symfony caching

我在 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 次,具体取决于以下因素:

  1. 缓存的当前状态,
  2. 可选参数(例如--no-warmup--no-optional-warmers),
  3. 缓存预热器是否可选(根据 isOptional() 方法)。

一点介绍:Symfony 使用名为 cache_warmer 的服务,它映射到 Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate 类。它用于聚合所有已注册的带有 kernel.cache_warmer 标记的缓存预热服务,并提供方便的方法来执行它们。

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

  1. Symfony\Component\HttpKernel\Kernel::initializeContainer() - 在每次内核初始化时执行,无论是在控制台还是网络模式下。如果您没有热缓存,它会触发非可选缓存预热器。
  2. 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/

相关文章:

python - 撤消禁用 pip 缓存

caching - 禁用 eclipselink 缓存和查询缓存 - 不起作用?

XMLHTTP 缓存 : Xml is bringing the same data after the first request Excel VBA

php - Laravel 双重验证正则表达式不起作用

javascript - 尝试使用ajax调用php函数不起作用

php - GROUP BY 与事件记录?

php - 什么时候使用对象数组而不是传统数组?

symfony - 在我的代码中触发 Doctrine 生命周期事件

php - 多行的内部连接

angularjs - 将 Angular.js 与 Symfony 2 表单一起使用