2016-07-08 9 views
5

ich memcache bin mit Zend_Config zu speichern (und andere Werte) - Ich bin die Werte Einstellung wie folgt:Memcache - gelöscht Werte von memcache wieder auftaucht

$memcache = new Memcache(); 
... 

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

I-Werte bin Löschen wie folgt:

Nachdem ich die Werte aus Memcache gelöscht habe, wird es in der gleichen Verbindung wie gelöscht angezeigt - Aufruf $memcache->get($key) gibt mir richtig NULL. Wenn ich das Skript jedoch aktualisiere (und eine neue Verbindung mit Memcache herstelle), werden die Daten wieder angezeigt, als ob der Memcache-Status nicht aktualisiert würde. Ich habe versucht, stattdessen replace (mit einem bestimmten Wert), den gleichen Effekt - der Wert wird nicht aktualisiert.

Aufruf $memcache->flush() funktioniert, und entfernt alles aus Memcache, jedoch möchte ich bestimmte Schlüssel löschen.

Auf der Manual-Seite gibt es eine kryptische Nachricht von vor 5 Jahren über Inkompatibilitäten zwischen PECL-Versionen und memcached (aber das ist vor 5 Jahren). Kann mir jemand erklären, was passieren könnte?

Ich bin mit Memcached 1.4.21 mit memcache (PECL) 3.0.8 auf PHP 5.6

+0

Die Methode 'delete' sollte' true' oder 'false' und nicht' NULL' zurückgeben - wie überprüfen Sie den Wert dessen, was zurückgegeben wird? – skrilled

+0

@skrilled - Ich habe nicht geschrieben, dass 'delete' Methode' NULL' zurückgibt, aber dass "$ memcache-> get ($ key)' aufruft, gibt mir NULL ". 'delete' gibt tatsächlich wahr zurück. – eithed

+0

Oh okay Entschuldigung für das Missverständnis. – skrilled

Antwort

6

Die Ausgabe aus der Nutzung dieser Stämme:

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

(Sie werden feststellen, dass es nicht in meiner ursprünglichen Abfrage enthalten ist, da es nicht tut alles, aber listet die in memcached gespeicherten Schlüssel/Werte auf

Das Problem mit dieser Funktionalität ist, dass es scheinbar stillschweigend bewirkt, dass Memcached schreibgeschützt wird. Während die Werte, die bei den Folgeaufrufen der Funktion geliefert werden, aktualisiert werden (da sie aus dem lokalen Speicher stammen), sind die Werte im Memcached-Dienst nicht.

Dieses Verhalten wirkt sich aktuellen up-to-date-Version von Memcached - das Bruchverhalten in memcache eingeführt wurde (2.2.x)

ich Prämie halten werde offen, wenn jemand fühlt sich an wie dieses Verhalten zu untersuchen

0

eine Art und Weise, die sehr gut funktioniert für mich ist, den Cache wieder genau mit dem gleichen Schlüssel zu setzen, sondern den Ablauf setzen Zeit ein paar Sekunden vor Jetzt. Dadurch läuft der Schlüssel in Ihrem Cache ab. Der C# -Code ist wie folgt aus:

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

Dies funktioniert leider nicht – eithed