是否有可能使特定操作的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 :任务是仅为特定操作(页面)重建缓存,保持其他缓存不变。
答案 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
]);