cid = $cid; $cache->data = is_object($data) ? memcache_clone($data) : $data; $cache->created = $time; $cache->expire = $expire; $cache->headers = $headers; // Save to memcache if ($expire == CACHE_TEMPORARY) { $expire = variable_get('cache_lifetime', 2591999); } // We manually track the expire time in $cache->expire. When the object // expires, we only allow one request to rebuild it to avoid cache stampedes. // Other requests for the expired object while it is still being rebuilt get // the expired object. dmemcache_set($cid, $cache, 0, $table); } /** * * Expire data from the cache. If called without arguments, expirable * entries will be cleared from the cache_page table. * * Memcache logic is simpler than the core cache because memcache doesn't have * a minimum cache lifetime consideration (it handles it internally), and * doesn't support wildcards. Wildcard flushes result in the entire table * being flushed. * * @param $cid * If set, the cache ID to delete. Otherwise, all cache entries that can * expire are deleted from the specified table. * * @param $table * If set, the table to delete from. * * @param $wildcard * If set to TRUE, the $cid is treated as a substring * to match rather than a complete ID. The match is a right hand * match. If '*' is given as $cid, the table $table will be emptied. */ function cache_clear_all($cid = NULL, $table = NULL, $wildcard = FALSE) { // If cid and table are not set, we should flush the cache_page table. if (!isset($cid) && !isset($table)) { $cid = '*'; $wildcard = TRUE; $table = 'cache_page'; } if (empty($cid) || ($cid == '*' && $wildcard !== TRUE)) { // don't do anything if cid is unset. this matches the default drupal behavior... if ($wildcard && $cid != '*') { if (variable_get('memcache_debug', FALSE)) { // call watchdog, since you probably didn't want to flush the entire bin. watchdog('memcache', "illegal wildcard in cache_clear_all - not flushing entire bin. table: $table. cid: $cid", WATCHDOG_WARNING); } } } else if ($cid == '*' || $wildcard === TRUE) { dmemcache_flush($table); } else { dmemcache_delete($cid, $table); } } /** * Provide a substitute clone() function for PHP4. This is a copy of drupal_clone * because common.inc isn't included early enough in the bootstrap process to * be able to depend on drupal_clone. */ function memcache_clone($object) { return version_compare(phpversion(), '5.0') < 0 ? $object : clone($object); }