gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:13:14 25 4
gpt4 key购买 nike

我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com