10

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

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

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

但在 prod 模式下,我需要缓存:清除或 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 不是模板变量,我不能强迫人们清空缓存:/

4

2 回答 2

21

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

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

参考:

Twig 环境选项

TwigBundle 配置

于 2014-07-08T09:23:36.923 回答
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 缓存标头,您还可以始终添加一个不断变化的值,例如当前时间戳,以避免缓存。

于 2013-09-19T18:06:00.093 回答