2013-02-14 8 views
12

Für mein Paket, das wir die Verwendung des Laravel Cache, machenLöschen von Laravel 4-Cache mit Muster für Schlüssel?

Jeder Cache-Schlüssel erstellen wir das Präfix, so erhalten wir mypackage-config, mypackage-md5ofafilename Manchmal brauche ich alle Cache-Dateien zu leeren, dass mein Paket erstellt hat, das Problem? Ich kenne nur das Muster der Cache-Schlüssel, ich kenne den gesamten Schlüssel nicht!

Also, ich brauche einen Weg zu gehen Cache::forget('mypackage-*') oder ähnliches, ist das möglich?

Wenn es nur für mein System war, weiß ich, dass ich den Dateicache verwende, also konnte ich die Dateien manuell aufheben, aber weil es ein generisches Paket ist, weiß ich nicht, welche Cachemethode der Endbenutzer verwendet kenne nur die Schnittstelle (alias die Laravel-Cache-Schnittstelle).

Antwort

10

Leicht - verwenden Cache::getMemory()

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

P. S. Entkoppeln Sie niemals die Cache-Dateien manuell. Der Laravel-Cache speichert alle Cache-Datensätze in einem Array, sodass er erwartet, dass die Datei vorhanden ist, auch wenn Sie die Verknüpfung aufheben.

+1

Just zu beachten, mit Datei-Cache und Redis, mit Laravel 4, das funktioniert nicht. es sagt, getMemory() Methode wurde nicht gefunden. – Arda

+3

getMemory() ist nur für Memcache verfügbar – Bala

+2

dies löst einen "Fehler" aus: {"type": "ErrorException", "message": "call_user_func_array() erwartet Parameter 1 als gültigen Callback, Klasse 'Illuminate \\ Cache \\ MemcachedStore 'hat keine Methode' getMemory '"," file ":" \/Users \/ericcumbee \/Desktop \/phpprojects \/sblitz \/vendor \/laravel \/framework \/src \/Illuminate \ /Cache\/Repository.php "," line ": 277}' Fehler für mich in Laravel 4.2 mit memcached – gsueagle2008

14

Eine andere Lösung: Solange Sie sind nicht mit Datei-oder Datenbank-Cache können Sie Cache Tags verwenden.

markieren Sie einfach jeden Cache-Eintrag mit Ihrem Paketname:

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

(Sie können auch die tags Methode mit remember verwenden, forever und rememberForever)

Wenn es Zeit ist, den Cache Ihres spülen Paket der Einträge nur tun

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

Hinweis: Wenn Sie auf die Cache-Einträge zugreifen müssen, müssen Sie immer noch auf die Tags verweisen. Z.B.

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

Auf diese Weise, ein anderen Cache-Eintrag mit Schlüssel config einen anderen Tag (z hisPackage) nicht mit Ihnen in Konflikt geraten.

6

Hier ist die gleiche Lösung wie in der angenommenen Antwort, aber speziell für Redis neu geschrieben.

mit den Tasten

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

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

Mit SCAN (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

Die Verwendung von 'KEYS' wird dringend empfohlen, da es ein O (N) -Befehl ist (d. H. Sie könnten ein DoS auslösen, indem Sie es ausführen und das RAM Ihres Servers beim Vorbereiten des Antwortpuffers erschöpfen). Ab Version 2.8 wird empfohlen, den Befehl 'SCAN' zu verwenden. –

1

Hier ist ein konkretes Beispiel Redis alle Schlüssel zu löschen, basierend auf einem bestimmten Präfix. Dies basiert auf der Antwort von Kasik, mit einigen Umstrukturierungen und zusätzlicher Sicherheit.

Beachten Sie, dass RedisStore unter dem Namespace ist 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); 
} 
Verwandte Themen