2013-02-14 16 views
12

,Anahtar için model kullanarak Laravel 4 önbelleğinden silme? Biz laravel cache faydalanmak paketim için

yarattığımız her önbellek anahtar öneki, bu yüzden benim paket yarattı bütün önbellek dosyalarını, sorunu temizlemek için gereken zamanlarda mypackage-config, mypackage-md5ofafilename olsun edilir? Sadece önbellek anahtarlarının kalıbını biliyorum, bütün anahtarı bilmiyorum!

Cache::forget('mypackage-*') veya benzeri bir yola ihtiyacım var, bu mümkün mü?

Sadece benim sistemim için olsaydım, dosya önbelleğini kullandığımı biliyorum, bu yüzden dosyaları el ile bağlantısını kesebilirdim, ancak genel bir paket olduğundan son kullanıcının hangi önbellek yöntemini kullandığını bilmiyorum. sadece arayüzü (aka Laravel önbellek arayüzü) biliyorum.

cevap

10

Kolay - Cache::getMemory()

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

dip not kullanma hiç 'önbellek' dosyalarını el ile kaldırma. Laravel önbellek, bir dizindeki tüm önbellek kayıtlarının bir kaydını tutar, bu nedenle 'bağlantısını' kaldırsanız bile, dosyanın orada olmasını bekler.

+1

Illuminate\Cache\RedisStore Sadece nota ad altında

Not laravel 4 kullanılarak, bu işe yaramaz. getMemory() yönteminin bulunmadığını söylüyor. – Arda

+3

getMemory(), memcache için kullanılabilir – Bala

+2

bu bir "" hata "atar: {" type ":" ErrorException "," message ":" call_user_func_array(), parametre 1'in geçerli bir geri arama olmasını bekler, 'Illuminate \\ Cache \\ MemcachedStore '' getMemory '"," file ":" \/Users \/ericcumbee \/Desktop \/phpprojects \/sblitz \/vendor \/laravel \/framework \/src \/Illuminate \ "yöntemine sahip değildir. /Cache\/Repository.php "," line ": 277}' benim hatam, Laravel 4.2 'de benim için hatalandı – gsueagle2008

14

Başka bir çözüm: dosya veya veritabanı önbelleği kullanmadığınız sürece Cache Tags kullanabilirsiniz.

Sadece paket adıyla her önbellek girdisini etiketlemek: bunun önbellek temizleme zamanı geldiğinde

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

(Ayrıca, remember ile forevertags yöntemini kullanabilir ve rememberForever) sizin paketin girişleri sadece

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

Not yapın: Önbellek girişlerine erişmeniz gerektiğinde, yine de etiketlere başvurmanız gerekir. Örneğin.

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

Bu şekilde, sizinki ile çakışmaması edecek farklı bir etiket (örn hisPackage) sahip anahtar config başka önbellek girişi.

6

Burada, kabul edilen yanıttakiyle aynı çözüm var, ancak özellikle Redis için yeniden yazılmıştır. TARAMA kullanma

kullanma TUŞLARI

$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' kullanımı, bir O (N) komutu olduğu için son derece cesaret vericidir (yani, sunucunun RAM'ini yanıt tamponunu hazırlarken çalıştırmanın yanı sıra bir DoS'u çalıştırarak bir DoS'u tetikleyebilirsiniz). V2.8'den itibaren önerilen yaklaşım 'SCAN' komutunu kullanmaktır. –

1

Burada verilen önek dayalı tüm anahtarları temizlemek için bir Redis belirli bir örnektir. Bu, bazı yeniden yapılanma ve ek güvenlik ile Kazik'in cevabına dayanmaktadır. RedisStore dosya önbellek ve REDIS ile

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