繁体   English   中英

Symfony2:禁用Twig缓存

[英]Symfony2: disable Twig cache

我正在尝试在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: ~

在生成和重新编写我的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重新编译或不使用app / cache,因为显然pdf内容在生产时将是动态的。

评论中的信息更新:

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

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

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

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

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

参考文献:

树枝环境选项

TwigBundle配置

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

首先,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,第二个URL来自1235 - 此数字更改URL足以触发新请求,而不是从缓存中获取旧版本。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM