Symfony2:禁用Twig缓存

时间:2013-09-18 22:45:09

标签: php caching symfony pdf 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: ~

在生成和重新编写我的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不是模板变量,我不能强迫人们清空他们的缓存:/

2 个答案:

答案 0 :(得分:17)

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

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

参考文献:

Twig Environment Options

TwigBundle Configuration

答案 1 :(得分:3)

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

首先,HTTP使用一些标头向客户端描述如何进行缓存。其中最糟糕的是声明所接收的资源应被视为下一次X的可缓存而不重新验证更新。较少侵入的版本是添加带有已交付版本的签名或最后修改的时间戳的标头,并且客户端应在每次使用它之前重新验证资源是否仍然是最新的。

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

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

  1. http://example.com/generated/summary.pdf?v=1234
  2. http://example.com/generated/summary.pdf?v=1235
  3. 第一个URL来自部署运行1234,第二个URL来自1235 - 此数字更改URL足以触发新请求,而不是从缓存中获取旧版本。

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