2016-07-08 9 views
5

पुनः दिखाई देने मैं Zend_Config (और अन्य मान) स्टोर करने के लिए उपयोग कर रहा हूँ मेम्कैश से हटा दिया - इस प्रकार मैं मान सेट कर रहा हूं:Memcache - मूल्यों मेम्कैश

$memcache = new Memcache(); 
... 

if (!$config = $memcache->get($memcache->unique_key.APPLICATION_DOMAIN."#config")) 
{ 
    ... 
    $memcache->set($memcache->unique_key.APPLICATION_DOMAIN."#config", $config); 
} 

मैं मूल्यों को हटा रहा हूं इस प्रकार है:

$memcache->delete($key); 

बाद मैं मेम्कैश से मान हटाना, यह ठीक से नष्ट कर दिया के रूप में ही सिलसिले में प्रदर्शित करता है - बुला $memcache->get($key) ठीक से मुझे NULL देता है। हालांकि, जब मैं स्क्रिप्ट को ताज़ा (और मेम्कैश साथ नया कनेक्शन स्थापित) डेटा में वापस दिखाई दे, के रूप में अगर मेम्कैश राज्य अपडेट नहीं हुए। मैं, बजाय replace का उपयोग कर (कुछ विशिष्ट मूल्य के साथ) की कोशिश की है एक ही प्रभाव के लिए - मूल्य अपडेट नहीं होता।

$memcache->flush() काम करता है कॉलिंग, और मेम्कैश से सब कुछ हटा देता है, लेकिन मैं विशिष्ट कुंजी हटाना चाहते हैं।

मैनुअल पृष्ठ पर 5 साल पहले से एक गुप्त संदेश PECL संस्करणों और memcached के बीच असंगतता के बारे में है (लेकिन यह है कि 5 साल पहले से है)। क्या कोई मुझे बता सकता है कि क्या हो रहा है?

मैं memcached 1.4.21 5.6

+0

'हटाएं' विधि को 'सत्य' या 'झूठा' वापस नहीं होना चाहिए 'न्यूल' - आप जो भी लौटाते हैं उसके मूल्य की जांच कैसे कर रहे हैं? – skrilled

+0

@skrilled - मैंने नहीं लिखा था कि 'हटाएं' विधि 'NULL' लौटाती है लेकिन वह "कॉलिंग '$ memcache-> प्राप्त करें ($ कुंजी)' ठीक से मुझे न्यूल देता है"। 'हटाएं' वास्तव में सच देता है। – eithed

+0

ओह ठीक है गलतफहमी के लिए खेद है। – skrilled

उत्तर

6

इस मुद्दे को इस के उपयोग की वजह से उपजी:

$list = array(); 
$allSlabs = $memcache->getExtendedStats('slabs'); 

foreach ($allSlabs as $server => $slabs) 
    foreach ($slabs as $slabId => $slabMeta) 
     foreach ($memcache->getExtendedStats('cachedump', (int) $slabId) as $entries) 
      if (!empty($entries)) 
       foreach ($entries as $key => $entry) 
        if (strpos($key, $memcache->unique_key) === 0) 
        { 
         $value = $memcache->get($key); 
         $list[$key] = is_string($value) && unserialize($value) ? unserialize($value) : $value; 
        } 

(आप देखेंगे कि यह मेरे मूल क्वेरी में शामिल नहीं है, के रूप में यह ऐसा नहीं करता है कुछ भी, लेकिन memcached में संग्रहीत कुंजी/मान सूचीबद्ध करता है)

इस कार्यक्षमता के साथ समस्या यह है कि जाहिर है, चुपचाप, memcached को पढ़ने के लिए कारण बनता है। जबकि फ़ंक्शन की परिणामी कॉल पर दिए गए मान अपडेट किए गए हैं (जैसा कि, मुझे लगता है, उन्हें स्थानीय मेमोरी से पुनर्प्राप्त किया जाता है), memcached सेवा में मान नहीं हैं।

यह व्यवहार memcached की वर्तमान अप-टू-डेट संस्करण को प्रभावित करता है - तोड़ने व्यवहार मेम्कैश में पेश किया गया था (2.2.x)

मैं इनाम खुला रखेंगे, तो किसी को इस व्यवहार की जांच के लिए की तरह लगता है

0

एक ही रास्ता है कि मेरे लिए बहुत अच्छी तरह से काम करता है का उपयोग कर रहा मेम्कैश (PECL) 3.0.8 के साथ पीएचपी पर एक ही कुंजी के साथ वास्तव में फिर से कैश सेट लेकिन समाप्ति डाल करने के लिए अब से पहले सेकंड का समय जोड़ा। इससे वह कुंजी आपके कैश में समाप्त हो जाती है। सी # कोड है कि तरह है:

memcachedCache.Set(objectName, yourvalue, DateTime.Now.AddSeconds(-10)); 
+0

दुर्भाग्य से यह काम नहीं करता है – eithed

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