Yii2 PageCache失效

时间:2018-02-16 16:02:27

标签: caching yii2 invalidation

是否有可能使特定操作的PageCache无效或删除。

考虑一下:

class SiteController extends Controller
{
    public function behaviors()
    {
        return [
            'pageCache' => [
                'class' => PageCache::className(),
                'duration' => Yii::$app->params['cacheTime'], // seconds
                'variations' => [
                    Yii::$app->language,
                    Yii::$app->request->get('id'), 
                ],
            ],
        ];
    }

    public function actionIndex( $id )
    {
       // action code 
    }
}

现在我想删除/无效缓存

  

action en / site / index?id = 1

目前我正在考虑在控制台应用中编写一些代码,但不知道如何实现这一点。

EDIT1 :我尝试为特定操作手动重建无效缓存。代码无法继续依赖'因为实施该行动几乎是不可能的。

EDIT2 :任务是仅为特定操作(页面)重建缓存,保持其他缓存不变。

4 个答案:

答案 0 :(得分:0)

您可以使用依赖项

使缓存无效
'pageCache' => [
        ...
        'dependency' => [
            'class' => 'yii\caching\DbDependency',
            'sql' => 'SELECT COUNT(*) FROM post',
        ],

http://www.yiiframework.com/doc-2.0/yii-filters-pagecache.html# $依赖性细节

答案 1 :(得分:0)

如果我理解正确您尝试仅针对特定操作禁用缓存,并且根据DOCS,您可以使用以下选项明确标识要应用缓存过滤器的操作ID或应该使用哪些操作ID不

$except array此过滤器不应适用的操作ID列表。 YII \基\ ActionFilter

$only array此过滤器应应用于的操作ID列表。

以下内容适用于您

return [
        'pageCache' => [
            'class' => PageCache::className(),
            'except'=>['index']
            'duration' => Yii::$app->params['cacheTime'], // seconds
            'variations' => [
                Yii::$app->language,
                Yii::$app->request->get('id'), 
            ],
        ],
    ];

答案 2 :(得分:0)

如果其他人需要... Yii2没有提供使特定页面的缓存无效的本机功能,但是存在缓存组件的删除功能。但是,有必要知道所请求页面的已生成键,但是生成此键的函数受保护(calculateCacheKey())。这样,最好的方法是创建自己的扩展\ yii \ filters \ PageCache的类。

    'pageCache' => function () {
        return new class extends \yii\filters\PageCache{
            public function init(){
                parent::init();
                $this->except = ['index'];
                $this->duration = Yii::$app->params['cacheTime'], // seconds;
                $this->variations = [
                   Yii::$app->language,
                   Yii::$app->request->get('id'), 
                ];
                if(Yii::$app->request->get('IC') == 1)
                    Yii::$app->cache->delete($this->calculateCacheKey());
            }
            public function beforeCacheResponse(){                  
                return Yii::$app->request->get('IC') != 1;
            }
        };
    },

在提供的代码中,为简单起见,我使用的是匿名类(PHP 7)。 相反,您可以根据需要创建类,并将其路径作为“类”参数告知,如问题中显示的配置所示。

请注意,我正在使用简单的逻辑来使缓存无效,检查是否有GET参数IC == 1,您可以使用所需的任何逻辑。

如果在使缓存无效之后您不想创建新的缓存,只需在\ yii \ filters \ PageCache中的beforeCacheResponse中返回false。

答案 3 :(得分:0)

您可以使用TagDependency进行更详细的失效:

public function behaviors()
{
    return [
        'pageCache' => [
            'class' => PageCache::className(),
            'duration' => Yii::$app->params['cacheTime'], // seconds
            'variations' => [
                Yii::$app->language,
                Yii::$app->request->get('id'), 
            ],
            'dependency' => new \yii\caching\TagDependency([
                'tags' => [
                    Yii::$app->requestedRoute,
                    Yii::$app->request->get('id'),
                ],
            ]),
        ],
    ];
}

要使缓存无效:

TagDependency::invalidate(Yii::$app->cache, [
    'site/index', // route of action 
    123, // ID of page
]);