[英]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.