2011-11-13 29 views
6

30 saniye boyunca önbelleğe almam gereken oldukça pahalı bir sunucu çağrısı var. Ancak, önbelleğin süresinin dolmasını sağlayamadığım görünüyor.Drupal 7 geçici önbellek ürününün son kullanma tarihi geç

Aşağıdaki kodda, önbellek ilk kez önbelleğe alındığında, (+ 30 saniye) süresinden sonra bile hiçbir zaman $ return-> cache_data değerini alamaz.

Not: Hatta $ cache-> sona erme yazdırabilirsiniz ve kesinlikle 30 saniye önce bir zamana ayarlanır ve asla güncelleştirilmez.

Aynı sonuçları aldığımı doğrulamak için birçok kez önbelleği el ile temizledim.

Bu konuda herhangi bir sorun var mı?

function mymodule_get_something($id) { 
    // set the unique cache id 
    $cid = 'id-'. $id; 

    // return data if there's an un-expired cache entry 
    // *** $cache ALWAYS gets populated with my expired data 
    if ($cache = cache_get($cid, 'cache_mymodule')) { 
    return $cache->data; 
    } 

    // set my super expensive data call here 
    $something = array('Double Decker Taco', 'Burrito Supreme'); 

    // set the cache to expire in 30 seconds 
    cache_set($cid, $something, 'cache_mymodule', time() + 30); 

    // return my data 
    return $something; 
} 

cevap

10

gibi sizin koduyla yanlış bir şey yok, ben sorun nasıl cache_set davrandığını düşünüyorum. docs page itibaren UNIX zaman damgası geçirmeden:

öğesinin en az o CACHE_TEMPORARY gibi davranır, bundan sonra verilen süre kadar tutulması gerektiğini belirtir. Böyle

CACHE_TEMPORARY davranacağını:

madde bir sonraki genel cache silin de kaldırılması gerektiğini gösterir.

En iyi tahminle örtük genel önbellek (cache_clear_all() kullanarak) silin o zorlama değil çünkü önbellek nesne devam edecektir.

if ($cache = cache_get($cid, 'cache_mymodule')) { 
    if ($cache->expire > REQUEST_TIME) { 
    return $cache->data; 
    } 
} 
+0

Teşekkür için:

Ben doldu eğer etrafında basit bir şekilde sadece manuel önbellek kontrolünden sonra geçerlilik süresini test etmek, ve bu önbellek nesne tekrar kurulur kadar düşürdüm olacağını düşünüyorum sağlık kontrolü. – Coder1

+1

Güzel yaklaşım. +1 ... EDIT: Sadece Clive olduğunu fark ettim. Tabii ki bu iyi bir yaklaşımdı. –

+0

Hello Clive, "sonraki genel önbellek" nedir? drush cc tümü hem CACHE_TEMPORARY hem de CACHE_PERMANENT öğelerini kaldırır. Genel önbellek tokatlama gerçekleştiğinde, herhangi bir fikir? –

İlgili konular