禁用特定块的缓存


9

我想让页面继续受益于面向匿名用户的Drupal 8缓存机制,除了特定的块,该块应该在知道刷新页面是从Views生成的情况下,在每个页面刷新时更新。

在技​​术上可行吗?怎么样?


如MPD所述,请使用最大年龄设置。您也可以通过用户界面在块编辑表单上执行此操作。

我也有这个问题-令人讨厌的是Drupal不能自动处理这个问题。缓存很好,但是Drupal应该用于动态网站...
James

Answers:


1

该视图阻止显示什么?

D8具有缓存标签和上下文,如果发生更改,它们将自动使该块无效。

因此,如果有节点列表,则每次添加或更新节点时,该块都会被更新,但在此之前,将使用缓存的版本。这比在每个页面上重建都要好得多。

它也与页面缓存一起使用,那些页面也将自动更新。

很多很多的东西只是工作与缓存开箱,无需任何手动配置。

编辑(回复评论):

使用随机排序插件随机吗?那应该自动将该块标记为不可缓存。但是,这不会影响页面缓存模块。现在有一个新的smartcache /动态页面缓存模块,但是它将仅在下一个beta(或RC!)中使用。最终,这将允许缓存页面的其余部分并仅构建该部分。

但是像这样的情况最好使用一些javascript来实现。如果只有几个节点,则可以全部显示它们,默认情况下是隐藏的,只是随机地使其中一个可见。或者使用JavaScript来请求返回随机广告的URL,或者更好地访问随机返回的N个URL,每个URL均返回一个广告(例如,通过返回URL列表,然后选择其中一个。您甚至可以直接针对图片URL进行此操作。


该视图返回一个随机节点,以改变广告组。
阿胺

我将等待下一个发布的干净解决方案,以便:)
Amine

是的,随机是来自“视图随机排序”插件。我同意,可以生成一个JavaScript块内容,将其放入实体列表中,然后在浏览器层使用一些随机或循环函数进行选择,以对其中之一进行选择并进行ajax处理。但是,在某些页面中,我将有多个这样的块,并且服务器端解决方案将是最合适的。

10

如果这是一个自定义块,则可以使用Cache API并将缓存的最大使用期限设置为0,例如

$build = [
 // ...
 '#cache' => [
   'max-age' => 0,
 ],
];

如果它是现有块,则可以对其进行更改以将其添加到渲染数组中。


如问题中所述,我的块是Views块。我认为太复杂了,无法在php / module层进行干预。

1
不幸的是,这无论如何都不起作用(尝试过)。好像页面是从pagecache传递的,并且包含过时的块。但我仍在调查中。
Rainer Feike
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.