2016-07-08 30 views
5

sto usando memcache per memorizzare Zend_Config (e altri valori) - Sto impostando i valori come segue:memcache - valori eliminati dal riapparire memcache

$memcache = new Memcache(); 
... 

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

sto eliminando valori come segue:

$memcache->delete($key); 

Dopo aver eliminare i valori da memcache, visualizza correttamente nella stessa connessione come cancellato - chiamando $memcache->get($key) mi dà correttamente NULL. Tuttavia, quando aggiorno lo script (e stabilisco una nuova connessione con memcache) i dati vengono visualizzati nuovamente, come se lo stato di memcache non fosse aggiornato. Ho provato a utilizzare replace invece (con qualche valore specifico), con lo stesso effetto: il valore non si aggiorna.

La chiamata $memcache->flush() funziona e rimuove tutto da memcache, tuttavia desidero eliminare chiavi specifiche.

Nella pagina di manuale c'è un messaggio criptico di 5 anni fa sulle incompatibilità tra le versioni PECL e memcached (ma questo è di 5 anni fa). Qualcuno può spiegarmi cosa potrebbe accadere?

Sto utilizzando memcached 1.4.21 con memcache (PECL) 3.0.8 su PHP 5.6

+0

il metodo 'delete' dovrebbe restituire' true' o 'false' not' NULL' - come stai controllando il valore di ciò che restituisce? – skrilled

+0

@skrilled - Non ho scritto che il metodo 'delete' restituisce' NULL' ma che "chiamando' $ memcache-> get ($ key) 'mi dà NULL in modo corretto". 'delete' restituisce effettivamente true. – eithed

+0

Oh ok scusa per l'equivoco. – skrilled

risposta

6

Il problema deriva da utilizzo di questo:

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

(si noterà che non è inclusa nel mio query originale, in quanto non fare qualsiasi cosa, ma elenca le chiavi/i valori memorizzati nella memcached)

Il problema con questa funzionalità è che apparentemente, silenziosamente, fa sì che il memcached diventi di sola lettura. Mentre i valori che vengono offerti alle chiamate successive della funzione vengono aggiornati (come, penso, vengono recuperati dalla memoria locale), i valori nel servizio memcached non sono.

Questo comportamento influisce attuale versione up-to-date di memcached - il comportamento di rottura è stato introdotto in memcache (2.2.x)

terrò taglie aperta se qualcuno si sente come per indagare questo comportamento

0

un modo che funziona per me molto bene è quello di impostare la cache ancora esattamente con la stessa chiave, ma mettere la scadenza coppia di secondi prima di Now. Questo fa sì che la chiave scada nella tua cache. Il codice C# è così:

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

Questo purtroppo non funziona – eithed