2011-11-13 14 views
6

मेरे पास एक काफी महंगा सर्वर कॉल है जिसे मुझे 30 सेकंड के लिए कैश करने की आवश्यकता है। ऐसा लगता है कि मुझे कैश की समयसीमा समाप्त नहीं हो सकती है।Drupal 7 अस्थायी कैश आइटम की अवधि समाप्त नहीं होगी

नीचे दिए गए कोड में, पहली बार कैश होने के बाद, यह समय() + 30 सेकंड के बाद भी वापस $ वापसी-> cache_data नहीं मिलेगा।

नोट, मैं $ कैश-> समय सीमा भी प्रिंट कर सकता हूं और यह निश्चित रूप से 30 सेकंड पहले एक समय पर सेट हो गया है और कभी अपडेट नहीं होता है।

मैंने एक ही परिणाम प्राप्त करने के लिए मैन्युअल रूप से कैश को कई बार साफ़ कर दिया है।

क्या इससे कुछ गलत लगता है?

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; 
} 

उत्तर

10

ऐसे रूप में अपने कोड के साथ गलत कुछ भी नहीं है, मुझे लगता है कि समस्या यह है कि cache_set बर्ताव करती है। docs page से, एक UNIX टाइमस्टैम्प गुजर:

इंगित करता है कि आइटम कम से कम भी समय, जिसके बाद यह CACHE_TEMPORARY तरह बर्ताव करता है जब तक रखा जाना चाहिए।

CACHE_TEMPORARY बर्ताव करता है इस तरह:

इंगित करता है कि आइटम अगले आम कैश पोंछ पर हटाया जाना चाहिए।

मेरे सबसे अच्छा अनुमान है कि क्योंकि आप परोक्ष मजबूर कर नहीं कर रहे हैं कि सामान्य कैश (cache_clear_all() का प्रयोग करके) पोंछ कैश वस्तु बना रहेगा है।

मुझे लगता है कि यह चारों ओर एक आसान तरीका सिर्फ मैन्युअल रूप से अपने कैश जांच के बाद समाप्ति समय का परीक्षण, और यह के माध्यम से करने के लिए फिर से स्थापित करने कि कैश वस्तु गिर जाने के लिए हो सकता है अगर यह समाप्त हो गया है:

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

के लिए धन्यवाद सैनिटी चेक। – Coder1

+1

अच्छा दृष्टिकोण। +1 ... संपादित करें: बस ध्यान दिया कि यह क्लाइव था। बेशक यह एक अच्छा दृष्टिकोण था। –

+0

हैलो क्लाइव, "अगली सामान्य कैश मिटाएं" वह क्या है? ड्रश सीसी सभी CACHE_TEMPORARY और CACHE_PERMANENT दोनों को हटा देता है। जब सामान्य कैश स्वाइप होता है, तो कोई विचार? –

संबंधित मुद्दे