问题描述
我在缓存组件中使用 FileCache。在我的控制器中,我使用:
[
'class' => 'yii\filters\HttpCache','only' => ['view'],'etagSeed' => function ($action,$params) {
$model = $this->findModel(Yii::$app->request->get("id"));
return $model->update_time;
},],
使用 etagSeed
和/或 lastModified
我遇到了同样的行为问题:
缓存适用于 yii\filters\PageCache
和 yii\filters\HttpCache
。但是当缓存失效时(例如更新页面后),我仍然看到旧的缓存内容。
所以当我从其他页面访问目标页面时,我得到的是旧内容。但是当我按下 F5 时,页面会刷新为最后的内容。
我已经在浏览器中检查了我的 GET 请求中的 Etag 值,我发现在我使用 F5 按钮刷新页面之前我正在获取旧的 Etag 值。
这可能是使用 HttpCache 时的标准浏览器行为?但是每次浏览器获取上次内容时,如何不刷新就可以看到新内容?
我错过了什么吗?
解决方法
您可以在控制器中使用 PageCache 和依赖项。请注意,如果您的页面是公开的,您应该准备好接受空 ID。
public function behaviors()
{
return [
'viewCache' => [
'class' => 'backend\components\filters\PageCache','only' => ['view'],'duration' => 86400,// 1 day
'variations' => [
$_GET['id'] ?? null,],'dependency' => [
'class' => 'yii\caching\DbDependency','sql' => 'SELECT update_time FROM my_table WHERE id = :id','params' => [
':id' => $_GET['id'] ?? null,]
]
'enabled' => [
isset($_GET['id']),];
}