Drupal 8:
我有一个块的代码成功地完成它的工作并返回它。该块称为“RacerProfile”,它将其所有内容转储到变量“$ pageContent”中。在最后它返回#markup。好。现在我怎么告诉这个每六个小时失效一次?
/**
* Provides a 'Racer Profile' Block
*
* @Block(
* id = "racer_profile",
* admin_label = @Translation("Slider v1 block")
* )
*/
class RacerProfile extends BlockBase {
/**
* {@inheritdoc}
*/
public function build()
{
// does all the work to make $pageContent via non-drupal
// database queries. However, for this example, let's just
// just imagine it gets the time of day. Then, let's set
// let's set the cache age to 5 seconds so F5-F5-F5-F5... should
// show 12 changes per minute on a repeatable schedule
$pageContent.= "<p> Date and Time: " . date("F jS Y h:i:s A");
return array(
'#markup' => $pageContent,
'#cache' => ['max-age' => 5 ,],
);
}
}
在Drupal的其他答案中,我看到“D8具有缓存标记和上下文,如果发生变化,将自动使该块无效。”很好,但我的代码正在检查第二个数据库。 Drupal无法知道那里正在发生什么变化。 (显然没有检查。)那么如何添加具有指定超时的缓存标记? (或者甚至这样做缓存标签?)我找不到例子。
注意:
- 上面的代码没有产生预期的结果。该页面对匿名用户是静态的。它仅在用户/管理员通过Web管理员清除缓存时才会更改。
- 显然,这与Configuration&gt;的管理区域内的最大缓存年龄无关。表现&gt;缓存&gt;页面缓存最大年龄。我不希望这个适用于整个网站,只是这个块。此外,该设置显然无论如何都无法控制缓存的这一方面,而是填充到渲染页面标题中的缓存信息。
- 显然,这与settings.php也没有任何关系,因为我再次不希望这个适用于整个站点,并且各个模块将有不同的超时要求。
- 网站的流量相对较低,所以如果每天渲染一次,即使每天只需要做一次也不是问题。每六个小时就意味着它会在人们在四个时区醒来之前发生变化。大多。 ;)我在这里明确表示,在我担心优化负载或使用之前,我对完成这项工作感兴趣。
- 我有多个具有不同有效期的自定义块。
- 我当然已经搜索了很多内容,并且尚未找到指定模块块的特定(以时间单位测量)超时的示例。甚至在drupal.org上的D8模块示例中
- 重要的是,该块需要为匿名用户控制其缓存。没有账号的人,“公众”浏览网站。
答案 0 :(得分:1)
您可以在块的渲染数组中添加缓存设置:
'#cache' => [
'max-age' => 60 * 60 * 24,
],
此处的时间以秒为单位。另请参阅:https://www.drupal.org/developing/api/8/cache/max-age
如果您确实有关于需要触发重置的事项的提示,您可以使用其他caching controls。听起来你很清楚你想要在何时何地缓存,所以探索缓存API上的材料可能值得你花时间。
鉴于您要从第二个数据库中提取,您可能还想探索BigPipe,这不是您所询问的内容,但是适用于需要一段时间才能收集的用例给定页面的所有信息。可能使用通过BigPipe构建的块将提供比Drupal中缓存的数据一段固定时间更好的用户体验(重建整个缓存引擎以允许我们远离该模式)。
答案 1 :(得分:0)
原来这是D8中正在处理的“主要”错误:https://www.drupal.org/node/2352009
简而言之,内部页面缓存模块当前忽略了渲染数组中冒泡的可缓存元数据的“max-age”属性。
即使你不使用内部页面缓存模块而不是像Varnish这样的外部缓存,max-age HTTP标头总是设置为你在“页面缓存最大年龄”中配置的任何内容“在性能设置中。如果需要,请参阅https://www.drupal.org/node/2732129,其中包含解决方法。