如何以编程方式为Drupal 8中的模块设置缓存期限?

And*_*rs8 6 caching drupal-8

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模块示例中也是如此

- 重要的是,块需要为匿名用户控制其缓存.没有帐户的人,"公众"浏览网站.

acr*_*man 3

您可以在块的渲染数组中添加缓存设置:

'#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 构建的块可能会提供更好的用户体验(整个缓存引擎被重建以允许我们摆脱这种模式)。