Symfony2:禁用 Twig 缓存


Symfony2: disable Twig cache

我正在尝试在生产模式下禁用树枝缓存,或强制它重新编译我的视图。

我正在使用KnapLaps SnappyBundle来生成一些PDF(DomPDF也出现了同样的问题),并且我有动态内容要渲染。

在开发模式下,我可以修改一些文本,甚至一些 css 属性,更改立即生效。

但是在生产模式下,我需要 cache:clear,或者 rm -rf app/cache/prod/twig/* 才能看到更改。

我在 Twig 部分的 config.yml 中尝试了以下选项(不是同时)

cache: "/dev/null"
cache: false
auto-reload: ~

在生成和重新生成我的 pdf 时,我还尝试了一些带有标题的东西:

$html = $this->renderView("xxxxPdfBundle:Pdf:test.html.twig", array("foo" => $bar));
return new Response(
    $this->get('knp_snappy.pdf')->getOutputFromHtml($html),
    200,
    array(
        'Cache-Control'         => 'no-cache, must-revalidate, post-check=0, pre-check=0',
        'Content-Type'          => 'application/pdf',
        'Content-Disposition'   => 'attachment; filename='.$file
    )
);

我不知道如何强制 twig 重新编译或不使用应用程序/缓存,因为显然 pdf 内容在生产时将是动态的。

评论中的信息更新:

我意识到即使是动态模板变量也没有更新,所以在生产中一遍又一遍地生成相同的 PDF,但在开发中却没有。

再次清除所有缓存后,该问题已修复:PDF 现在使用设计的动态内容生成。

尽管如此,一个问题仍然存在:如果我的网站处于生产状态时,我决定更改 pdf 模板中的 CSS 样式怎么办?CSS不是模板变量,我不能强迫人们清空缓存:/

禁用 Twig 缓存机制的正确方法是将cache环境参数设置为 false 而不是缓存目录:

# config_dev.yml
# ...
twig:
    cache: false

引用:

树枝环境选项

树枝捆绑包配置

客户端缓存的问题有一些答案。

首先,HTTP 使用一些标头向客户端描述如何执行缓存。其中最糟糕的是声明收到的资源应被视为可缓存以供下次 X 使用,而无需重新验证更新。侵入性较小的版本是添加一个标头,其中包含已交付版本的签名或上次修改的时间戳,客户端应在每次使用资源之前重新验证资源是否仍然是最新的。

第一种缓存只能通过在浏览器中删除客户端缓存来更新。第二个可能可以通过再次强制加载页面(Ctrl-F5 左右)来规避,但这确实与允许清除缓存的菜单一样隐藏。

为了安全起见,通常的方法是将标签、修订号、递增计数器或任何可用的内容添加到用于该资源的 URL 的查询字符串中。

  1. http://example.com/generated/summary.pdf?v=1234
  2. http://example.com/generated/summary.pdf?v=1235

第一个 URL 来自部署运行 1234,第二个来自 1235 - 此数字更改 URL 足以触发新请求,而不是从缓存中获取旧版本。

我不知道您的系统中是否有可用的东西可以像这样操作。如果您无法禁用 HTTP 缓存标头,您还可以始终添加一个不断变化的值(如当前时间戳)以避免缓存。