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

时间:2016-06-14 21:16:06

标签: 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 ,],
    );

    }
 }

在Drupal的其他答案中,我看到“D8具有缓存标记和上下文,如果发生变化,将自动使该块无效。”很好,但我的代码正在检查第二个数据库。 Drupal无法知道那里正在发生什么变化。 (显然没有检查。)那么如何添加具有指定超时的缓存标记? (或者甚至这样做缓存标签?)我找不到例子。

注意:

- 上面的代码没有产生预期的结果。该页面对匿名用户是静态的。它仅在用户/管理员通过Web管理员清除缓存时才会更改。

- 显然,这与Configuration&gt;的管理区域内的最大缓存年龄无关。表现&gt;缓存&gt;页面缓存最大年龄。我不希望这个适用于整个网站,只是这个块。此外,该设置显然无论如何都无法控制缓存的这一方面,而是填充到渲染页面标题中的缓存信息。

- 显然,这与settings.php也没有任何关系,因为我再次不希望这个适用于整个站点,并且各个模块将有不同的超时要求。

- 网站的流量相对较低,所以如果每天渲染一次,即使每天只需要做一次也不是问题。每六个小时就意味着它会在人们在四个时区醒来之前发生变化。大多。 ;)我在这里明确表示,在我担心优化负载或使用之前,我对完成这项工作感兴趣。

- 我有多个具有不同有效期的自定义块。

- 我当然已经搜索了很多内容,并且尚未找到指定模块块的特定(以时间单位测量)超时的示例。甚至在drupal.org上的D8模块示例中

- 重要的是,该块需要为匿名用户控制其缓存。没有账号的人,“公众”浏览网站。

2 个答案:

答案 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,其中包含解决方法。