Contributed by
Fabien Potencier
in #21038.

Symfony程序在初次运行之前会生成一些缓存文件以提升性能(例如把Twig模板和XML/YAML/Annotations的配置信息转换成PHP代码)。

这些缓存文件,在一个被称为 "cache warmup(缓存预热)" 的进程中被生成。Symfony包含了量 "cache warmers(加热器)" (用于 routing, templates, configuration, Doctrine, 等等),而通过创建一个实现了 Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface 接口的类,同时在将其定义为服务时打上 kernel.cache_warmer 标签,你的程序可以定义自定义的 "cache warmers"。

Symfony的 FrameworkBundle 提供了两个命令用于预热缓存:

1
2
3
4
5
6
7
8
9
10
11
# warmup the existing cache but don't clear it
# 预热既存的缓存,但并不清除它
$  ./bin/console cache:warmup (--env=prod|dev)
 
# clear the existing cache and warm it up
# 清除当前缓存,再预热它
$  ./bin/console cache:clear (--env=prod|dev)
 
# clear the existing cache but don't warm it up
# 清除当前缓存也不预热它
$  ./bin/console cache:clear --no-warmup (--env=prod|dev)

然而, cache:clear 命令的warmup预热部分,并不能工作得很好,也很难保证所生成的缓存能够与由 cache:warmup 生成的缓存完全相同。

由于Symfony 4的主要目标之一,就是要能生成全部缓存,以便在“只读”的系统上运行程序,因此我们不建议在Symfony 3.3中使用 cache:clear 命令的warmup部分,同时会在Symfony 4.0中移除此功能。

实践中,这意味着你应当在 cache:clear 命令中始终添加 --no-warmup 选项,然后再执行 cache:clear 命令:

1
2
3
4
5
6
# before / 之前
$  ./bin/console cache:clear (--env=prod|dev)
 
# after / 之后
$  ./bin/console cache:clear --no-warmup (--env=prod|dev)
$  ./bin/console cache:warmup (--env=prod|dev)