【问题标题】:Symfony2: disable Twig cacheSymfony2:禁用 Twig 缓存
【发布时间】:2013-09-23 21:08:12
【问题描述】:

我正在尝试在 prod 模式下禁用 twig 缓存,或者强制它重新编译我的视图。

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

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

但在 prod 模式下,我需要 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 内容在生产时将是动态的。

来自 cmets 的信息更新:

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

再次清除所有缓存后,该问题已得到解决:现在生成的 PDF 中包含设计的动态内容。

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

【问题讨论】:

  • 您是否检查过模板中应该是动态的部分(即模板变量)在生产中启用缓存时没有更改?我相信在生产中不一遍又一遍地编译模板,并且在部署新版本时清除缓存是一个想要的功能,因为性能。
  • @Sven 动态部分(我使用例如 {{ foo.name }} )不会在生产中生成的 pdf 中更新,除非我清除缓存:/ 在开发模式下,{{ foo.name }} 在每个 pdf 文件中都很好地显示和更新,无需清除缓存...
  • 你在用这个twig-cache-extension - 我从一些问题和cmets的印象是Twig本身不会保留曾经生成的结果,那么你遇到这种情况的原因是什么?
  • 好吧,我的错,我手动清除了整个缓存目录,现在模板变量在每个 pdf 生成时都很好地呈现。尽管如此,一个问题仍然存在:如果我的网站在生产中,我决定更改 pdf 模板中的 CSS 样式怎么办? CSS 不是模板变量,我不能强迫人们清空他们的缓存:/
  • 我已将您的信息添加到您的问题中。

标签: php caching symfony pdf twig


【解决方案1】:

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

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

参考资料:

Twig Environment Options

TwigBundle Configuration

【讨论】:

  • 您还必须清除 Symfony 缓存才能使其生效:php app/console cache:clear -e prod
【解决方案2】:

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

首先,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 缓存标头,您也可以始终添加一个不断变化的值(例如当前时间戳)以避免缓存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-03
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多