2014-10-28 51 views
0

我有一個我正在緩存的片段,因爲有很多數據庫命中來生成內容。無法刪除使用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延長,但我的密鑰是從COutputCache生成的,它使用CFileCache,我不認爲有迴路。我也試過用一個重載版本的COutputCache開始一個小工具,它的工作原理似乎是一個非常討厭的黑客。

$properties = array(); 
    $properties['id']=Yii::app()->params["cache_name_matrix"]; 
    $cache=$this->beginWidget('MyCOutputCache',$properties); 
    $key = $cache->getKeyHack(); 

我目前的解決辦法是刷新整個緩存,但這種擺脫一切,似乎有點重手。

任何想法?

回答

1

計算嵌入到COutputCache使用稱爲getCacheKey保護方法,其在內部調用getBaseCacheKey然後根據指定的變化變換它的高速緩存項。在你的,最簡單的情況下,沒有任何變化,我相信它將以'Yii.COutputCache.my_id .......'爲結尾,其中'Yii.COutputCache'。是COutputCache :: CACHE_KEY_PREFIX。看看這個方法的code

所以,知道這一點,你在技術上可以手動刪除你的片段。但是我強烈建議你看看manual中描述的依賴機制。你說如果數據庫中的某些內容發生變化,你會使這個片斷無效,所以可能你需要CDbCacheDependency

+0

1段:即基本相同,我討厭黑客。似乎沒有辦法從CFileCache訪問COutputCache,因此您必須假定使用了COutputCache並自己生成文件名。第二段:我使用這個,但它不是我想要的,因爲成本太高。我需要檢查的地方有很多,並且緩存活動查詢很複雜,並且必須完成每個請求。對不起,我不能接受這個答案,因爲我想直接刪除緩存項目,因爲它似乎仍然是一個更好的方法。看起來我必須自己實現它,除非有人已經擁有! – 2014-11-18 14:10:12

+0

最後投票,因爲我最終使用CDbCacheDependency,但它仍然不是我想要的。 – 2015-01-09 14:52:28

0

Yii2試試這個

$key = Array ('yii\widgets\FragmentCache','key_id'); 
Yii::$app->cache->delete($key); 
+0

謝謝,下次我在代碼中嘗試一下。 – 2018-01-31 12:53:02