Commit 5843ee53 authored by robertDouglass's avatar robertDouglass
Browse files

memcache.inc is now memcache only - no database storage whatsoever. If you...

memcache.inc is now memcache only - no database storage whatsoever. If you want memcache that falls back on db storage, use memcache.db.inc
parent 586709bc
......@@ -210,83 +210,11 @@ function dmemcache_key($key, $bin = 'cache') {
* 'cache_menu', 'cache_page', or 'cache' for the default cache.
*/
function cache_get($key, $table = 'cache') {
global $user;
// Garbage collection necessary when enforcing a minimum cache lifetime
$cache_flush = variable_get('cache_flush', 0);
if ($cache_flush && ($cache_flush + variable_get('cache_lifetime', 0) <= time())) {
// Time to flush old cache data
db_query("DELETE FROM {%s} WHERE expire != %d AND expire <= %d", $table, CACHE_PERMANENT, $cache_flush);
variable_set('cache_flush', 0);
}
// If we have a memcache hit for this, return it.
if ($cache = dmemcache_get($key, $table)) {
return $cache;
}
// Look for a database cache hit.
if ($cache = db_fetch_object(db_query("SELECT data, created, headers, expire, serialized FROM {%s} WHERE cid = '%s'", $table, $key))) {
if (isset($cache->data)) {
// If the data is permanent or we're not enforcing a minimum cache lifetime
// always return the cached data.
if ($cache->expire == CACHE_PERMANENT || !variable_get('cache_lifetime', 0)) {
$cache->data = db_decode_blob($cache->data);
if ($cache->serialized) {
$cache->data = unserialize($cache->data);
}
}
// If enforcing a minimum cache lifetime, validate that the data is
// currently valid for this user before we return it by making sure the
// cache entry was created before the timestamp in the current session's
// cache timer. The cache variable is loaded into the $user object by
// sess_read() in session.inc.
else {
if ($user->cache > $cache->created) {
// This cache data is too old and thus not valid for us, ignore it.
return 0;
}
else {
$cache->data = db_decode_blob($cache->data);
if ($cache->serialized) {
$cache->data = unserialize($cache->data);
}
}
}
}
// By calling cache_set with an extra paramater to signify no db storage,
// we can lazy instantiate memcache that just comes online.
cache_set($key, $table, $cache->data, $cache->expire, $cache->headers, FALSE);
return $cache;
}
return 0;
return dmemcache_get($key, $table);
}
/**
* Store data in the persistent cache.
*
* The persistent cache is split up into four database
* tables. Contributed modules can add additional tables.
*
* 'cache_page': This table stores generated pages for anonymous
* users. This is the only table affected by the page cache setting on
* the administrator panel.
*
* 'cache_menu': Stores the cachable part of the users' menus.
*
* 'cache_filter': Stores filtered pieces of content. This table is
* periodically cleared of stale entries by cron.
*
* 'cache': Generic cache storage table.
*
* The reasons for having several tables are as follows:
*
* - smaller tables allow for faster selects and inserts
* - we try to put fast changing cache items and rather static
* ones into different tables. The effect is that only the fast
* changing tables will need a lot of writes to disk. The more
* static tables will also be better cachable with MySQL's query cache
* Store data in memcache.
*
* @param $cid
* The cache ID of the data to store.
......@@ -310,7 +238,7 @@ function cache_get($key, $table = 'cache') {
* It allows us to do a cache_set and not write to the database, but only
* to memcache.
*/
function cache_set($cid, $table = 'cache', $data, $expire = CACHE_PERMANENT, $headers = NULL, $db_storage = TRUE) {
function cache_set($cid, $table = 'cache', $data, $expire = CACHE_PERMANENT, $headers = NULL) {
// Create new cache object.
$cache = new stdClass;
$cache->cid = $cid;
......@@ -319,21 +247,6 @@ function cache_set($cid, $table = 'cache', $data, $expire = CACHE_PERMANENT, $he
$cache->expire = $expire;
$cache->headers = $headers;
if ($db_storage) {
$serialized = 0;
if (is_object($data) || is_array($data)) {
$data = serialize($data);
$serialized = 1;
}
// Save to the database
db_lock_table($table);
db_query("UPDATE {$table} SET data = %b, created = %d, expire = %d, headers = '%s', serialized = %d WHERE cid = '%s'", $data, time(), $expire, $headers, $serialized, $cid);
if (!db_affected_rows()) {
@db_query("INSERT INTO {$table} (cid, data, created, expire, headers, serialized) VALUES ('%s', %b, %d, %d, '%s', %d)", $cid, $data, time(), $expire, $headers, $serialized);
}
db_unlock_tables();
}
// Save to memcache
if ($expire == CACHE_PERMANENT || $expire > time()) {
dmemcache_set($cid, $cache, $expire, $table);
......@@ -359,8 +272,6 @@ function cache_set($cid, $table = 'cache', $data, $expire = CACHE_PERMANENT, $he
* match. If '*' is given as $cid, the table $table will be emptied.
*/
function cache_clear_all($cid = NULL, $table = NULL, $wildcard = FALSE) {
global $user;
// Memcache logic is simpler because memcache doesn't have a minimum cache
// lifetime consideration (it handles it internally), and doesn't support
// wildcards.
......@@ -371,48 +282,4 @@ function cache_clear_all($cid = NULL, $table = NULL, $wildcard = FALSE) {
else {
dmemcache_delete($cid, $table);
}
if (!isset($cid) && !isset($table)) {
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', 0);
if ($cache_flush == 0) {
// This is the first request to clear the cache, start a timer.
variable_set('cache_flush', time());
}
else if (time() > ($cache_flush + variable_get('cache_lifetime', 0))) {
// Clear the cache for everyone, cache_flush_delay seconds have
// passed since the first request to clear the cache.
db_query("DELETE FROM {%s} WHERE expire != %d AND expire < %d", $table, CACHE_PERMANENT, time());
variable_set('cache_flush', 0);
}
}
else {
// No minimum cache lifetime, flush all temporary cache entries now.
db_query("DELETE FROM {%s} WHERE expire != %d AND expire < %d", $table, CACHE_PERMANENT, time());
}
}
else {
if ($wildcard) {
if ($cid == '*') {
db_query("DELETE FROM {%s}", $table);
}
else {
db_query("DELETE FROM {%s} WHERE cid LIKE '%s%%'", $table, $cid);
}
}
else {
db_query("DELETE FROM {%s} WHERE cid = '%s'", $table, $cid);
}
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment