function cache_clear_all

You are here

7 cache.inc cache_clear_all($cid = NULL, $bin = NULL, $wildcard = FALSE)
4.6 bootstrap.inc cache_clear_all($cid = NULL, $wildcard = false)
4.7 bootstrap.inc cache_clear_all($cid = NULL, $wildcard = false)
5 cache.inc cache_clear_all($cid = NULL, $table = NULL, $wildcard = FALSE)
6 cache.inc cache_clear_all($cid = NULL, $table = NULL, $wildcard = FALSE)
6 cache-install.inc cache_clear_all($cid = NULL, $table = NULL, $wildcard = FALSE)

Expire data from the cache. If called without arguments, expirable entries will be cleared from the cache_page and cache_block tables.

Parameters

$cid: If set, the cache ID to delete. Otherwise, all cache entries that can expire are deleted.

$table: If set, the table $table to delete from. Mandatory argument if $cid is set.

$wildcard: If $wildcard is TRUE, cache IDs starting with $cid are deleted in addition to the exact cache ID specified by $cid. If $wildcard is TRUE and $cid is '*' then the entire table $table is emptied.

52 calls to cache_clear_all()
aggregator_refresh in modules/aggregator/aggregator.module
Checks a news feed for new items.
block_add_block_form_submit in modules/block/block.admin.inc
Save the new custom block.
block_admin_configure_submit in modules/block/block.admin.inc
block_admin_display_form_submit in modules/block/block.admin.inc
Process main blocks administration form submission.
block_box_delete_submit in modules/block/block.admin.inc
Deletion of custom blocks.

... See full list

2 string references to 'cache_clear_all'
menu_cache_clear in includes/menu.inc
Clears the cached cached data for a single named menu.
_menu_clear_page_cache in includes/menu.inc
Helper function to clear the page and block caches at most twice per page load.

File

includes/cache.inc, line 136

Code

function cache_clear_all($cid = NULL, $table = NULL, $wildcard = FALSE) {
  global $user;

  if (!isset($cid) && !isset($table)) {
    // Clear the block cache first, so stale data will
    // not end up in the page cache.
    cache_clear_all(NULL, 'cache_block');
    cache_clear_all(NULL, 'cache_page');
    return;
  }

  if (empty($cid)) {
    if (variable_get('cache_lifetime', 0)) {
      // We store the time in the current user's $user->cache variable which
      // will be saved into the sessions table by sess_write(). We then
      // simulate that the cache was flushed for this user by not returning
      // cached data that was cached before the timestamp.
      $user->cache = time();

      $cache_flush = variable_get('cache_flush_' . $table, 0);
      if ($cache_flush == 0) {
        // This is the first request to clear the cache, start a timer.
        variable_set('cache_flush_' . $table, time());
      }
      else if (time() > ($cache_flush + variable_get('cache_lifetime', 0))) {
        // Clear the cache for everyone, cache_lifetime seconds have
        // passed since the first request to clear the cache.
        db_query("DELETE FROM {" . $table . "} WHERE expire != %d AND expire < %d", CACHE_PERMANENT, time());
        variable_set('cache_flush_' . $table, 0);
      }
    }
    else {
      // No minimum cache lifetime, flush all temporary cache entries now.
      db_query("DELETE FROM {" . $table . "} WHERE expire != %d AND expire < %d", CACHE_PERMANENT, time());
    }
  }
  else {
    if ($wildcard) {
      if ($cid == '*') {
        db_query("TRUNCATE TABLE {" . $table . "}");
      }
      else {
        db_query("DELETE FROM {" . $table . "} WHERE cid LIKE '%s%%'", $cid);
      }
    }
    else {
      db_query("DELETE FROM {" . $table . "} WHERE cid = '%s'", $cid);
    }
  }
}

Comments

Has anyone seen the cache_form table get huge? Ours was 445mb!

I hade to manually run cache_clear_all(NULL, 'cache_form'); then optimise the table form mysql to clear it out.

Yes, I've noticed it a few times. I always empty it. I wonder why clearing all caches doesn't empty that table. Perhaps a bug in core?

I had an issue clearing nodecomments data from cache_view_data when calling cache_clear_all('nodecomments:','cache_view_data',TRUE)

It wasn't clearing the cache. The ":" colon was the problem. I took that off and it works fine.

I wonder if cache_clear_all will respect $db_prefix. It seems that it doesn't.
All my tables are named main_ as prefix. Shouldn't cache_clear_all have a procedure for inserting the $db_prefix before call to db_query?