滚动
缓存最大存活时间 (Cache max-age)
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 模块不起作用。例如,请看以下问题:
- #2352009: [pp-3] 将元素的最大存活时间传递到页面头和页面缓存
- #2449749: 添加 #cache['downstream-ttl'] 以强制过期,并通过添加 #cache['age'] 修复 #cache['max-age'] 的逻辑
- #2835068: PageCache 缓存不可缓存的响应(违反 HTTP/1.0 规范)+ D8 故意禁用 HTTP/1.0 代理 = WTF
- #2951814: 即使对于不可缓存的响应,也始终设置 X-Drupal-Cache 和 X-Drupal-Dynamic-Cache 头
在这些(以及可能其他)问题没有解决之前,请注意:仅仅为包含在页面中的渲染数组设置最大存活时间还不足以让匿名用户在过期后看到新版本。与此同时,提供的 Cache Control Override 模块尝试缓解这些问题。你也可以通过在依赖时间的内容页面上设置自定义的 缓存标签,并通过 hook_cron() 手动使这些标签失效,来获得更好的效果。祝好运!