2013-02-14 12 views
12

अपने पैकेज के लिए हम Laravel कैश का इस्तेमाल करते हैं,कुंजी के लिए पैटर्न का उपयोग कर Laravel 4 कैश से हटाना?

हर कैश कुंजी हम बनाने के उपसर्ग में है, इसलिए हम mypackage-config, mypackage-md5ofafilename बार मुझे लगता है कि मेरी पैकेज बनाया गया है सभी कैश फ़ाइलें, मुद्दा फ्लश करने के लिए की जरूरत है पर मिलता है? मैं केवल कैश कुंजी के पैटर्न को जानता हूं, मुझे पूरी कुंजी नहीं पता!

तो, मुझे Cache::forget('mypackage-*') या इसी तरह के जाने का कोई तरीका चाहिए, क्या यह संभव है?

अगर यह सिर्फ मेरे सिस्टम के लिए था, तो मुझे पता है कि मैं फ़ाइल कैश का उपयोग कर रहा हूं, इसलिए मैं फ़ाइलों को मैन्युअल रूप से अनलिंक कर सकता हूं, लेकिन क्योंकि यह एक सामान्य पैकेज है, मुझे नहीं पता कि अंतिम उपयोगकर्ता किस कैश विधि का उपयोग कर रहा है, मैं बस इंटरफ़ेस को जानें (उर्फ लैरावेल कैश इंटरफ़ेस)।

उत्तर

10

आसान - का उपयोग Cache::getMemory()

foreach (Cache::getMemory() as $cacheKey => $cacheValue) 
{ 
    if (strpos($cacheKey, 'mypackage') !== false) 
    { 
     Cache::forget($cacheKey); 
    } 
} 

पी.एस. मैन्युअल रूप से 'कैश' फ़ाइलों को अनलिंक न करें। लैरवेल कैश एक सरणी में सभी कैश रिकॉर्ड का रिकॉर्ड रखता है, इसलिए यह फ़ाइल को वहां से होने की उम्मीद करेगा, भले ही आप इसे 'अनलिंक' करें।

+1

बस नोट करने के लिए किया जा रहा है कि, फ़ाइल कैश और Redis के साथ, Laravel 4 का उपयोग कर, यह काम नहीं करता। यह कहता है getMemory() विधि नहीं मिली है। – Arda

+3

getMemory() केवल memcache के लिए उपलब्ध है – Bala

+2

यह 'त्रुटि "फेंकता है: {" टाइप ":" त्रुटि अपवाद "," संदेश ":" call_user_func_array() पैरामीटर 1 मान्य कॉलबैक होने की अपेक्षा करता है, वर्ग' रोशनी \\ कैश \\ MemcachedStore 'में कोई विधि नहीं है' getMemory '"," फ़ाइल ":" \/उपयोगकर्ता \/ericcumbee \/डेस्कटॉप \/phpprojects \/sblitz \/विक्रेता \/laravel \/ढांचे \/src \/रोशनी \ /Cache\/Repository.php "," line ": 277} 'लारवेल 4.2 में मेरे लिए त्रुटि memcached – gsueagle2008

14

एक और समाधान: जब तक आप फ़ाइल या डेटाबेस कैश का उपयोग नहीं कर रहे हैं तो आप Cache Tags का उपयोग कर सकते हैं।

बस अपने पैकेज का नाम के साथ हर कैश प्रविष्टि को टैग:

Cache::tags('myPackage')->put('config', $config, $minutes); 
Cache::tags('myPackage')->put('md5ofafilename', $md5, $minutes); 

(तुम भी tags विधि remember साथ, का उपयोग कर सकते forever, और rememberForever)

जब इसके बारे में कैश फ्लश करने के लिए समय आ गया है अपने पैकेज की प्रविष्टियां बस करो

Cache::tags('myPackage')->flush(); 

नोट: जब आपको कैश प्रविष्टियों तक पहुंचने की आवश्यकता होती है तो आपको अभी भी टैग का संदर्भ देना होगा। जैसे

$myConfig = Cache::tags('myPackage')->get('config'); 

इस तरह, एक अलग टैग (जैसे hisPackage) तुम्हारा के साथ संघर्ष नहीं होगा होने कुंजी config के साथ एक और कैश प्रविष्टि।

6

यहां स्वीकृत उत्तर के समान समाधान है, लेकिन विशेष रूप से रेडिस के लिए पुनः लिखा गया है।

का उपयोग KEYS

$redis = Cache::getRedis(); 
$keys = $redis->keys("*"); 

foreach ($keys as $key) { 
    if (strpos($key, 'mypackage') !== false) 
    { 
    $redis->del($key); 
    } 
} 

स्कैन का उपयोग करना (Redis> = 2.8.0)

$redis = Cache::getRedis(); 
$cursor = 0; 

while($data = $redis->scan($cursor)) 
{ 
    $cursor = $data[0]; 

    foreach($data[1] as $key) 
    { 
    if (strpos($key, 'mypackage') !== false) 
     { 
     $redis->del($key); 
     } 
    } 
    } 

    if ($cursor == 0) break; 
} 
+1

'KEYS' का उपयोग अत्यधिक हतोत्साहित है क्योंकि यह एक ओ (एन) कमांड है (यानी आप इसे चलाने के द्वारा एक डीओएस ट्रिगर कर सकते हैं और उत्तर के बफर तैयार करने में अपने सर्वर की रैम को थका सकते हैं)। V2.8 के अनुसार अनुशंसित दृष्टिकोण 'SCAN' कमांड का उपयोग करना है। –

1

यहाँ एक Redis विशिष्ट उदाहरण दिए गए उपसर्ग के आधार पर सभी कुंजियों को अनुमति देना। यह कुछ पुनर्गठन और अतिरिक्त सुरक्षा के साथ, काज़िक के उत्तर पर आधारित है।

नोट RedisStore नाम स्थान Illuminate\Cache\RedisStore

$cacheDriver = Cache::driver(); 
if ($cacheDriver instanceof(RedisStore)) { 
    $cursor = 0; 
    do { 
     $data = $cacheDriver->scan($cursor); 
     $cursor = $data[0]; 
     $cacheEntries = $data[1]; 

     foreach ($cacheEntries as $key) { 
      // This clears based on prefix. Change according to your use case. 
      if (starts_with($key, Cache::getPrefix())) { 
       $redis->del($key); 
      } 
     } 

    } while ($cursor != 0); 
} 
संबंधित मुद्दे