2012-05-03 3 views
9

Ho un semplice esempio in cui ho impostato un valore per 5 secondi. Il problema è che dopo 5 secondi; Ricevo ancora un valore quando mi aspettavo "falso".Memcache + PHP - Perché i dati non scadono?

$memcache = new Memcache; 
$memcache->connect('localhost', 11211) or die ("Could not connect"); 


$memcache->set('foo', 'bar', 0, 5); // 5 seconds expiry 
var_dump($memcache->get('foo')); // bar 
sleep(10); 
var_dump($memcache->get('foo')); // still shows bar 

Ecco la versione del server memcache

versione del server: 1.4.13

+1

Sono curioso, dal momento che ho provato nella mia macchina e sto vedendo bool (falso) nel secondo caso. – g13n

+0

Vedo "barra" in entrambe le uscite – shergill

+0

Prova a dormire per 10 secondi, solo per eliminare eventuali sovrapposizioni. –

risposta

1

Come il codice guarda bene - la prossima catena su tutta la linea è quello di guardare sia la versione di PHP memcache estensione non funzionante o server memcached stesso.

Questa ottenere un ma difficile. La cosa più semplice è escludere prima il server memcached. (C'è un'interfaccia PHP è possibile installare - ma questo non vi aiuterà a lavorare po outwhich.) Quindi ...

Nel terminale (o finestra di comando in Windows) digitare

telnet localhost 11211 

(Nota - telnet il client non è installato in Windows per impostazione predefinita - vai su "pannello di controllo", "attiva o disattiva le funzionalità di Windows" e aggiungi da lì.)

Questo ti dà accesso a memcached.

quindi digitare

stats items 

che elenca gli elementi di memoria in memcached.

Speriamo che hai soltanto una lastra, in modo da rilevare il suo numero e il tipo

stats cachedump [Number] 0 

E questo elencherà ciò che è registrato nella cache.

Se questo mostra ancora "bar" (in formato codificato) allora del server memcached che non funziona - l'aggiornamento per una versione più recente.

Se questo non mostra "bar" (o, preferibilmente, l'elemento non esiste - si ottiene invece ERROR) quindi sarà l'estensione memcache a PHP che non funziona. Di nuovo, controlla la tua versione di quello.

Al termine, tipo

quit 

alternativo è quello di controllare "memcached" (estensione php) e riscrivere il codice PHP con quelle classi. È più recente. Se ancora non funziona, è sicuramente un server memcached; se funziona è stata l'estensione php memcache.

+0

Ecco quello che ottengo stats articoli articoli STAT: 1: numero 1 articoli STAT: 1: Età 15 STAT articoli: 1: sgomberato 0 articoli STAT: 1: evicted_nonzero 0 articoli STAT: 1: evicted_time 0 articoli STAT: 1: OutOfMemory 0 articoli STAT: 1: tailrepairs 0 articoli STAT: 1: rigenerate 0 articoli STAT: 1: expired_unfetched 0 Voci STAT: 1: evicted_unfetched 0 quindi vuol dire che il server memcache non funziona perché l'elemento è ancora nella cache? – shergill

+0

Prova l'ultima istruzione sopra (stats cachedump 1 0) e dovrebbe darti qualcosa in cambio. – Robbie

4

ritardo al gioco, ma nel codice sembra che si sta passando "0" per la scadenza (non "5"), che si traduce in "non scadere mai" Nello specifico:

$memcache->set('foo', 'bar', 0, 5); // 5 seconds expiry 

Dovrebbe essere :

$memcache->set('foo', 'bar', 5); // 5 seconds expiry 

A meno che non sto equivoco the PHP documentation located here, il che dimostra che il comando set prende tre parametri:

public bool Memcached::set (string $key , mixed $value [, int $expiration ]) 

Modifica: Whoops, vedo che stai usando l'estensione Memcache e non Memcached, which does have four parmaters. Forse provare a utilizzare il MEMCACHE_COMPRESSED costante invece di 0 per vedere se funziona:

$memcache->set('foo', 'bar', MEMCACHE_COMPRESSED, 5); // 5 seconds expiry 
0

C'era un bug nel server memcached tra cui la versione 1.4.13 attraverso almeno 1.4.14 che, una volta che il server di memcached era stato in esecuzione per qualche tempo, a volte sarebbe entrato in una modalità in cui non sarebbe riuscito a scadere correttamente i valori.

Il riavvio del servizio è stato risolto per me, e spero che le nuove versioni lo risolvano in modo permanente.