我正在使用KnapLaps SnappyBundle生成一些PDF(DomPDF出现同样的问题),我有动态内容来渲染.
在开发模式下,我可以修改一些文本,甚至一些css属性,这些更改立即生效.
但是在prod模式下,我需要缓存:clear,或者rm -rf app / cache / prod / twig / *来查看更改.
我在我的config.yml中为Twig部分尝试了以下选项(不是在同一时间)
cache: "/dev/null" cache: false auto-reload: ~
$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不是模板变量,我不能强迫人们清空它们的缓存:/
首先,HTTP使用一些标头向客户端描述如何进行缓存.其中最糟糕的是声明所接收的资源应被视为下一次X的可缓存而不重新验证更新.较少侵入的版本是添加带有已交付版本的签名或最后修改的时间戳的标头,并且客户端应在每次使用它之前重新验证资源是否仍然是最新的.
只能通过删除浏览器中的客户端缓存来更新第一种缓存.通过再次强制加载页面(Ctrl-F5左右)可能会绕过第二个,但这实际上与允许清除缓存的菜单一样隐藏.
为了安全起见,通常的方法是将标记,修订号,递增计数器或任何可用的内容添加到用于该资源的URL的查询字符串中.
> http://example.com/generated/summary.pdf?v=1234
> http://example.com/generated/summary.pdf?v=1235
第一个URL来自部署运行1234,第二个URL来自1235 – 此数字更改URL足以触发新请求,而不是从缓存中获取旧版本.
我不知道你的系统中是否有可用的东西这样做.如果无法禁用HTTP缓存标头,您还可以始终添加一个不断变化的值,如当前时间戳,以避免缓存.