2

Using the steps explained on A Beginner's Guide to Caching Data in Drupal 7, I'm storing an array with a specified expiration time.

cache_get() is still returning stale cache, when the expiration time is passed. Even Cron is not deleting the cache entry. (I've checked the cache_block table.)

This is the code I am using.

$out = &drupal_static(__FUNCTION__);
        
if (!isset($out)) {
  if (($cache = cache_get(__FUNCTION__,'cache_block'))) {
    $out = $cache->data;
    dsm("cache returned");
  }
  else {
    // Do something.
    $out = '<ul style="list-style:none;padding-right:20px">' . $out . "</ul>";
    cache_set(__FUNCTION__, $out, 'cache_block', strtotime("23:59:59")+2);
  }
}
    
return $out;

Only "cache clear all" in the Performance tab is clearing this cache entry.

In that article I can read this.

Expired entries will be automatically discarded as they pass that date.

That does not seem to happen, although I've verified that the "expire" value in the cache table is beyond the current time.

I can clear the cache myself, but then cache_get() does not return the "expire" time in the table.

Anything I'm missing here?

0

1 Answer 1

0

As you can see in the documentation:

$expire: One of the following values:

  • CACHE_PERMANENT: Indicates that the item should never be removed unless explicitly told to using cache_clear_all() with a cache ID.
  • CACHE_TEMPORARY: Indicates that the item should be removed at the next general cache wipe.
  • A Unix timestamp: Indicates that the item should be kept at least until the given time, after which it behaves like CACHE_TEMPORARY.

Please note - it's not "at most". It's "at least". So your code works just the way it is to be expected. If you want to force-expire it, use cache_clear_all( __FUNCTION__ , 'cache_block'), for example in hook_cron() or at the beginning of your code.

Also note that it looks like you are re-saving cache at each use. That's not an usual thing, saving data is CPU and HDD expensive. It costs more than not caching at all. So consider only setting cache if it was not found in the first place, and needs to be regenerated. If cache is already set, let it expire and don't set it again.

2
  • The +2 seconds is for testing. I've placed the correct code now. How would I know when the cache has expired?
    – user5858
    Commented Oct 17, 2013 at 9:54
  • It's not about +2, really. It's about setting cache at use, no matter if it was there already or not.
    – Mołot
    Commented Oct 17, 2013 at 9:56

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.