logo

额外区块类型 (EBT) - 全新的布局构建器体验❗

额外区块类型 (EBT) - 样式化、可定制的区块类型:幻灯片、标签页、卡片、手风琴等更多类型。内置背景、DOM Box、JavaScript 插件的设置。立即体验布局构建的未来。

演示 EBT 模块 下载 EBT 模块

❗额外段落类型 (EPT) - 全新的 Paragraphs 体验

额外段落类型 (EPT) - 类似的基于 Paragraph 的模块集合。

演示 EPT 模块 滚动

滚动

缓存最大存活时间 (Cache max-age)

03/10/2025, by Ivan

Cache max-age = 依赖时间

Cache max-age 类似于 HTTP Cache-Control 头中的 max-age 指令。

为什么?

缓存最大存活时间提供了一种声明式的方式来创建依赖于时间的缓存。

某些数据只在有限的时间段内有效,在这种情况下,你会希望为其指定相应的最大存活时间。然而在 Drupal 8 核心中,我们没有仅在有限时间内有效的数据;我们通常是永久缓存(见下文),并完全依赖 缓存标签 来进行失效处理。

是什么?

缓存最大存活时间是一个正整数,表示秒数。

缓存最大存活时间以单个整数传递,因为对于某个缓存项来说逻辑上只能有一个最大存活时间。

示例:

  • 60 表示缓存 60 秒
  • 100 表示缓存 100 秒
  • 0 表示缓存 0 秒,即不缓存
  • \Drupal\Core\Cache\Cache::PERMANENT 表示永久缓存,即只会因缓存标签而失效。(换句话说:∞ 或无限秒。)

因此,例如,如果你想阻止渲染的区块被缓存,你需要为它指定 max-age = 0。

大多数渲染数组的示例:

$build['#cache']['max-age'] = 0;

函数中的示例:

\Drupal::cache()->set('my_cache_item', $school_list, REQUEST_TIME + (86400));

如果你想把区块的 max-age 改为 0,你需要实现 getCacheMaxAge 方法。

最大存活时间的限制

不幸的是,max-age 对匿名用户和 Drupal 核心的 Page Cache 模块不起作用。例如,请看以下问题:

在这些(以及可能其他)问题没有解决之前,请注意:仅仅为包含在页面中的渲染数组设置最大存活时间还不足以让匿名用户在过期后看到新版本。与此同时,提供的 Cache Control Override 模块尝试缓解这些问题。你也可以通过在依赖时间的内容页面上设置自定义的 缓存标签,并通过 hook_cron() 手动使这些标签失效,来获得更好的效果。祝好运!