缓存问题 - 刷新页面F5 按钮以查看修改的内容

问题描述

我在缓存组件中使用 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\PageCacheyii\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']),];  
}   

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...