2011-11-13 11 views
6

Tengo una llamada de servidor bastante cara que necesito almacenar en caché durante 30 segundos. Sin embargo, parece que no puedo hacer que el caché expire.El elemento de caché temporal de Drupal 7 no caducará

En el código siguiente, después de la primera vez que se almacena en caché, nunca va a conseguir más allá de $ Regresar-> cache_data, incluso después de la hora() + 30 segundos.

Nota, puedo incluso imprimir $ Cache> expirará y definitivamente es ajustado a un tiempo pasado actualizaciones hace más de 30 segundos y nunca.

He despejado manualmente caché muchas veces para confirmar consigo los mismos resultados.

¿Hay algo que se vea mal con esto?

function mymodule_get_something($id) { 
    // set the unique cache id 
    $cid = 'id-'. $id; 

    // return data if there's an un-expired cache entry 
    // *** $cache ALWAYS gets populated with my expired data 
    if ($cache = cache_get($cid, 'cache_mymodule')) { 
    return $cache->data; 
    } 

    // set my super expensive data call here 
    $something = array('Double Decker Taco', 'Burrito Supreme'); 

    // set the cache to expire in 30 seconds 
    cache_set($cid, $something, 'cache_mymodule', time() + 30); 

    // return my data 
    return $something; 
} 

Respuesta

10

No hay nada malo con su código como tal, creo que el problema está en cómo se comporta cache_set. Desde el docs page, pasando una marca de tiempo UNIX:

indica que el elemento debe mantenerse al menos hasta el momento, después de lo cual se comporta como CACHE_TEMPORARY.

CACHE_TEMPORARY se comporta como este:

indica que el elemento debe ser eliminado en la próxima caché general de limpiar.

Mi mejor conjetura es que debido a que no está implícita obligando a que la caché general del polvo (utilizando cache_clear_all()) el objeto de caché persistirá.

creo que una manera sencilla de evitar que sería sólo para probar manualmente el tiempo de caducidad después de su salida de caché, y se deja caer a través de re-configuración de ese objeto caché si ha caducado:

if ($cache = cache_get($cid, 'cache_mymodule')) { 
    if ($cache->expire > REQUEST_TIME) { 
    return $cache->data; 
    } 
} 
+0

Gracias por el control de cordura. – Coder1

+1

Buen enfoque. +1 ... EDITAR: Me di cuenta de que era Clive. Por supuesto que fue un buen enfoque. –

+0

Hola Clive, "la próxima limpieza general del caché" ¿qué es eso? drush cc all elimina tanto CACHE_TEMPORARY como CACHE_PERMANENT. Cuando ocurre un deslizamiento de caché general, ¿alguna idea? –

Cuestiones relacionadas