簡體   English   中英

無法刪除使用beginCache創建的緩存項目

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM