Symfony2:禁用Twig缓存

syl*_*zys 9 php pdf caching symfony twig

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

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

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

但是在prod模式下,我需要缓存:clear,或者rm -rf app/cache/prod/twig/*来查看更改.

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

cache: "/dev/null"
cache: false
auto-reload: ~
Run Code Online (Sandbox Code Playgroud)

在生成和重新编写我的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
    )
);
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何强制twig重新编译或不使用app/cache,因为显然pdf内容在生产时将是动态的.

评论中的信息更新:

我发现即使动态模板变量也没有更新,因此相同的PDF在生产中反复生成,但在开发中却没有.

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

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

flu*_*flu 18

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

# config_dev.yml
# ...
twig:
    cache: false
Run Code Online (Sandbox Code Playgroud)

参考文献:

树枝环境选项

TwigBundle配置


Sve*_*ven 3

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

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