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 ,],
);
}
}
Run Code Online (Sandbox Code Playgroud)
在其他Drupal答案中,我已经看到"D8具有缓存标记和上下文,如果有变化,它将自动使块无效." 很好,但我的代码正在检查第二个数据库.Drupal无法知道那里正在发生什么变化.(显然没有检查.)那么如何添加具有指定超时的缓存标记?(或者甚至做缓存标签吗?)我找不到例子.
笔记:
- 上面的代码不会产生预期的结果.该页面对匿名用户是静态的.它仅在用户/管理员通过Web管理员清除缓存时才会更改.
- 显然,这与Configuration> Performance> Caching> Page cache maximum age的管理区域内的Maximum Cache年龄无关.我不希望这个适用于整个网站,只是这个块.此外,该设置显然无论如何都无法控制缓存的这一方面,而是填充到已呈现页面的标题中的缓存信息.
- 显然,这也与settings.php没有任何关系,因为我再次不希望这适用于整个站点,并且各种模块将具有不同的超时要求.
- 网站的流量相对较低,因此如果每天渲染四次,即使每天只需要进行一次也不是问题.每六个小时就意味着它会在人们在四个时区醒来之前发生变化.大多.;)我在这里明确表示,在我担心优化负载或使用之前,我对完成这项工作很感兴趣.
- 我有多个具有不同有效期的自定义块.
- 我当然已经搜索了很多,并且尚未找到指定模块块的特定(以时间单位测量)超时的示例.甚至在drupal.org上的D8模块示例中也是如此
- 重要的是,块需要为匿名用户控制其缓存.没有帐户的人,"公众"浏览网站.
您可以在块的渲染数组中添加缓存设置:
'#cache' => [
'max-age' => 60 * 60 * 24,
],
Run Code Online (Sandbox Code Playgroud)
这里的时间以秒为单位。另请参阅: https: //www.drupal.org/developing/api/8/cache/max-age
如果您确实有关于需要触发重置的事情的提示,您可以使用其他一些缓存控件。听起来您对想要在何时何地缓存什么内容有非常清晰的认识,因此探索缓存 API 上的材料可能值得您花时间。
鉴于您正在从第二个数据库中提取数据,您可能还想探索BigPipe,这不是您所询问的,但适用于需要一段时间才能收集给定页面的所有信息的用例。与在 Drupal 中缓存固定时间的数据相比,使用通过 BigPipe 构建的块可能会提供更好的用户体验(整个缓存引擎被重建以允许我们摆脱这种模式)。