2012-05-03 22 views
9

Tengo un ejemplo simple en el que establezco un valor de 5 segundos. El problema es que después de 5 segundos; Todavía obtengo un valor cuando esperaba 'falso'.Memcache + PHP - ¿Por qué los datos no están expirando?

$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 

Aquí es la versión del servidor memcache

versión del servidor: 1.4.13

+1

Tengo curiosidad, ya que probé en mi máquina y estoy viendo bool (falso) en el segundo caso. – g13n

+0

Estoy viendo 'bar' en ambas salidas – shergill

+0

Intente dormir durante 10 segundos, solo para eliminar cualquier posible superposición. –

Respuesta

1

Como el código se ve bien - la siguiente cadena abajo de la línea es mirar ya sea en su versión del PHP Memcache la extensión no funciona, o el servidor memcached en sí.

Esto consigue un pero complicado. Lo más fácil es descartar primero el servidor memcached. (Hay una interfaz de PHP puede instalar - pero eso no le ayudará a trabajar poco outwhich.) Entonces ...

En terminal (o ventana de comandos en Windows) escriba

telnet localhost 11211 

(Nota - telnet el cliente no está instalado en Windows de manera predeterminada: vaya a "panel de control", "active o desactive las características de Windows" y añádalo desde allí).

Esto le da acceso a memcached.

continuación, escriba

stats items 

que enumera los elementos de la memoria en memcached.

Esperemos que sólo tienes una losa, así que tenga en cuenta su número y tipo

stats cachedump [Number] 0 

Y esto mostrará lo que está grabado en la memoria caché.

Si esto todavía muestra "barra" (en formato codificado), entonces es un servidor memcached que no funciona - actualice para una versión más nueva.

Si esto no muestra "barra" (o, preferiblemente, el elemento simplemente no existe - se obtiene ERROR en su lugar), entonces será la extensión de Memcache para PHP que no está funcionando. De nuevo, revisa tu versión de eso.

Cuando haya terminado, tipo

quit 

alternativa es retirar "memcached" (extensión php) y volver a escribir el código PHP con esas clases. Es más nuevo. Si eso todavía falla, definitivamente es un servidor de memcached; si eso funciona, era la extensión php memcache.

+0

Aquí es lo que me pasa Estadísticas artículos artículos STAT: 1: Número 1 artículos STAT: 1: Edad 15 STAT los objetos: 1: desalojados 0 artículos STAT: 1: evicted_nonzero 0 artículos STAT: 1: evicted_time 0 artículos STAT: 1: OutOfMemory 0 artículos STAT: 1: tailrepairs 0 artículos STAT: 1: reclamados 0 artículos STAT: 1: 0 artículos expired_unfetched STAT: 1: 0 evicted_unfetched por lo que quiere decir que el servidor memcache no está funcionando como el elemento se encuentra todavía en la memoria caché? – shergill

+0

Pruebe la última instrucción anterior (stats cachedump 1 0) y le devolverá algo. – Robbie

4

tarde al juego, pero en su código que parece que está de paso "0" para la expiración (no "5"), lo que se traduce en "no caduque nunca" Específicamente:

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

En caso de ser :

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

A menos que esté malentendido the PHP documentation located here, lo que demuestra que el comando set toma tres parámetros:

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

Editar: Vaya, veo que está utilizando la extensión Memcache y no Memcached, which does have four parmaters. Tal vez intente utilizar el MEMCACHE_COMPRESSED constante en lugar de 0 a ver si funciona:

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

Hubo un error en el servidor memcached incluyendo la versión 1.4.13 a través de al menos 1.4.14 que, una vez que el servidor memcached había estado funcionando durante algún tiempo, a veces entraba en un modo en el que no podía caducar correctamente los valores.

El reinicio del servicio fijo por mí, y tengo la esperanza de que las nuevas versiones arreglan de manera más permanente.

Cuestiones relacionadas