Frage

Nehmen wir an, ich habe diese Variablen in APC, Memcached und EacCelerator gespeichert:

  • article_1_0
  • article_1_1
  • article_3_2
  • article_3_3
  • article_2_4

Wie kann ich alle zwischengespeicherten Variablen löschen, die mit beginnen article_3_ (Sie können bis zu 10000 erreichen)?

Gibt es eine Möglichkeit, die zwischengespeicherten Variablen aufzulisten?

War es hilfreich?

Lösung

Die langsame Lösung

Für APC:

$iterator = new APCIterator('user', '#^article_3_#', APC_ITER_KEY);
foreach($iterator as $entry_name) {
    apc_delete($entry_name);
}

Für EacCelerator:

foreach(eaccelerator_list_keys() as $name => $infos) {
    if (preg_match('#^article_3_#', $name)) {
        eaccelerator_rm($name);
    }
}

Schauen Sie sich für Memcached an @Riks Antwort

Die richtige Lösung

Die allgemeine Lösung für die gleichzeitige Auslassung mehrerer Schlüssel besteht darin, sie zu namensspace. Um sie abzulaufen, müssen Sie nur den Namespace ändern:

Angenommen, Sie haben eine Gruppe von Schlüssel "article_3_1", "article_3_2", .... Sie können sie wie folgt speichern:

$ns = apc_fetch('article_3_namespace');
apc_store($ns."_article_3_1", $value);
apc_store($ns."_article_3_2", $value);

Holen sie so:

$ns = apc_fetch('article_3_namespace');
apc_fetch($ns."_article_3_1");

Und leugnen sie alle, indem sie einfach den Namespace erhöhen:

apc_inc('article_3_namespace');

Andere Tipps

Obwohl die Dokumente sagen, dass Apciterator in APC> = 3.1.1 verfügbar ist, bin ich auf mehreren Systemen, die behaupten, APC 3.1.9 zu haben. Es gibt jedoch keinen Apciterator vorhanden. Wenn Sie keinen Apciterator zur Verfügung haben, geben Sie so etwas wie diesen einen Wirbel:

$aCacheInfo = apc_cache_info('user');

foreach($aCacheInfo['cache_list'] as $_aCacheInfo)
    if(strpos($_aCacheInfo['info'], 'key_prefix:') === 0)
        apc_delete($_aCacheInfo['info']);

In diesem Beispiel prüfen wir nach einem Präfix im Schlüssel, aber Sie könnten Preg_match ET verwenden. Al und erreichen etwas näher an dem, was Apciterator bietet.

Wenn es Möglichkeiten gibt, Alternativen für Memcached zu verwenden, scache Unterstützt strukturierte Schlüsselspazitäten. Damit können Sie Daten auf verschachtelte Pfade speichern:

scache_shset($conn, 'article/1/0', $data10);
scache_shset($conn, 'article/3/0', $data30);
scache_shset($conn, 'article/3/1', $data31);

und zerstören Sie schließlich Daten, indem Sie den übergeordneten Knoten löschen

scache_shunset($conn, 'article/3');

Es gibt einen Apciterator, der Ihnen hilft, die Schlüssel in APC zu durchsuchen. Sofortieren Sie den Apkiterator.

Apciterator :: Valid () bedeutet, dass noch Schlüsse zum ITROUGE aufgenommen werden. Apciterator :: Key () gibt Ihnen den APC -Schlüssel zurück. Apciterator :: Next () verschiebt die Iteratorposition in das nächste Element.

// APC
$iterator = new APCIterator('user', '/^article_3_/');

while($iterator->valid()) {
     apc_delete($iterator->key());
     // You can view the info for this APC cache value and so on by using 
     // $iterator->current() which is array
     $iterator->next();
}

Für Memcache können Sie verwenden Memcached und verwenden Getallkeys Methode

// Memcached 
$m = new Memcached();
$m->addServer('mem1.domain.com', 11211);

$items = $m->getAllKeys();

foreach($items as $item) {
    if(preg_match('#^article_3_#', $item)) {
        $m->delete($item);
    }
}  
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top