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

Php 为什么我的Symfony 2缓存加热器被多次调用?,php,symfony,caching,Php,Symfony,Caching,Symfony 2应用程序中的一个捆绑包具有自定义缓存 当从控制台在开发模式下运行时,它会向stdout写入一个已被调用的通知 有时(并非总是如此),它会为单个控制台缓存多次调用:clear命令,多个通知被写入stdout就是明证 有人能解释一下为什么会这样吗?这正常吗?是否所有缓存加热器都被多次调用 环境: Ubuntu 14.04.3 PHP 7.0.2-4 Symfony 2.7.9 ------编辑:2016年2月21日08:36------- 由于各种原因(大小、NDA等),按实际

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

当从控制台在开发模式下运行时,它会向stdout写入一个已被调用的通知

有时(并非总是如此),它会为单个控制台缓存多次调用:clear命令,多个通知被写入stdout就是明证

有人能解释一下为什么会这样吗?这正常吗?是否所有缓存加热器都被多次调用

环境:

  • Ubuntu 14.04.3
  • PHP 7.0.2-4
  • Symfony 2.7.9
------编辑:2016年2月21日08:36-------

由于各种原因(大小、NDA等),按实际来源发布是不切实际的,因此,我用cache warmer创建了一个很小的包,在调用时只回显它的类名

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

//
// 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()

根据以下因素,执行一次控制台缓存:清除可触发缓存升温0到3次

  • 缓存的当前状态
  • 可选参数(例如,
    --无预热
    --无可选加热器
  • 缓存加热器是否可选(根据
    isOptional()
    方法)
  • 简单介绍:Symfony使用一个名为
    cache\u warner
    的服务,该服务映射到
    Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate
    类。它用于聚合所有注册的带有
    kernel.cache\u warner
    标记的缓存预热服务,并提供执行它们的方便方法

    有两种方法在
    控制台缓存:clear
    调用期间显式启动缓存预热:

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


    另外,出于好奇,在Symfony代码中只花了2个小时的时间;)

    如果没有您的bundle自定义缓存温暖的代码,就无法帮助您…您究竟为什么需要我的温暖的源代码。它实现了标准的stuff:isOptional()返回false。warmUp()构建我的缓存。然后,当然还有服务定义,它指定类名、构造函数参数和kernel.cache作为name标记的值。这是您的定制缓存加热器吗?是否来自第三方捆绑包?您是否发现了一些特殊情况,其中多次调用而不是其他调用?如果你在寻求帮助,请提供更多细节,帮助我们帮助你。好的。我已经发布了代码。几个月前我遇到了这个问题,并找到了这种行为的解释,但。。。我再也记不起来了。我会把你的问题加入书签,如果我记得是什么,我会提供和回答:)。这似乎有点低效,但由于缓存预热只在每个生产版本中发生一次,我想这是合理的。谢谢你花时间把它挖出来。我对Symfony的内部结构还不是很熟悉。