[英]Can not delete cached item created with beginCache
我有一个要缓存的片段,因为有很多数据库命中来生成内容。
main.php:
'cache'=>array(
'class'=>'system.caching.CFileCache'
)
view.php
<?php if($this->beginCache("my_id", array('duration' => 315360000))) { ?>
// lots of heavy stuff
<?php $this->endCache(); } ?>
仅当我调整数据库表中的配置时,缓存的片段才会更改。 我正在尝试找到一种使用“ my_id”删除缓存项的方法。 Yii文档在某种程度上具有误导性,因为当谈论beginCache
它指的是键(“ my_id”),但是当谈论从缓存中删除项目时,它也谈论键,但它不是同一个键! beginCache
本质上是COutputCache
小部件的包装,因此“ my_id”不是高速缓存中使用的键。
有谁知道如何将“ my_id”转换为对缓存友好的键,以便我可以从缓存中删除该特定项。
我尝试从CFileCache
扩展,但是我的密钥是从使用CFileCache
COutputCache
生成的,我认为没有反向路由。 我也尝试过使用COutputCache
的重载版本开始一个小部件,该小版本虽然可以正常工作,但看起来确实很讨厌。
$properties = array();
$properties['id']=Yii::app()->params["cache_name_matrix"];
$cache=$this->beginWidget('MyCOutputCache',$properties);
$key = $cache->getKeyHack();
我当前的解决方法是刷新整个缓存,但是这摆脱了所有问题,似乎有点费力。
有任何想法吗?
COutputCache使用称为getCacheKey的受保护方法计算缓存密钥,该方法在内部调用getBaseCacheKey ,然后根据指定的变体对其进行转换。 在您最简单的情况下,没有任何变化,我相信它将以“ Yii.COutputCache.my_id .......”之类的名字结尾,其中“ Yii.COutputCache”。 是COutputCache :: CACHE_KEY_PREFIX。 看一下此方法的代码 。
因此,知道这一点后,您可以从技术上手动删除片段。 但是我强烈建议您看一下手册中描述的依赖机制。 您说如果数据库中发生某些更改,则使该片段无效,因此可能需要CDbCacheDependency 。
Yii2试试这个
$key = Array ('yii\widgets\FragmentCache','key_id');
Yii::$app->cache->delete($key);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.