Skip to content

Commit

Permalink
- Add APC support in rcube_cache
Browse files Browse the repository at this point in the history
  • Loading branch information
alecpl committed May 18, 2011
1 parent b5f836e commit 8edb3d9
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 11 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG
@@ -1,7 +1,7 @@
CHANGELOG Roundcube Webmail
===========================

- Added general rcube_cache class with memcache support
- Added general rcube_cache class with Memcache and APC support
- Improved caching performance by skipping writes of unchanged data
- Option enable_caching replaced by imap_cache and messages_cache options
- Add forward-as-attachment feature
Expand Down
2 changes: 1 addition & 1 deletion config/main.inc.php.dist
Expand Up @@ -109,7 +109,7 @@ $rcmail_config['imap_auth_cid'] = null;
// Optional IMAP authentication password to be used for imap_auth_cid
$rcmail_config['imap_auth_pw'] = null;

// Type of IMAP indexes cache. Supported values: 'db' and 'memcache'.
// Type of IMAP indexes cache. Supported values: 'db', 'apc' and 'memcache'.
$rcmail_config['imap_cache'] = null;

// Enables messages cache. Only 'db' cache is supported.
Expand Down
2 changes: 1 addition & 1 deletion program/include/rcmail.php
Expand Up @@ -356,7 +356,7 @@ public function get_memcache()
* Initialize and get cache object
*
* @param string $name Cache identifier
* @param string $type Cache type ('db' or 'memcache')
* @param string $type Cache type ('db', 'apc' or 'memcache')
*
* @return rcube_cache Cache object
*/
Expand Down
40 changes: 33 additions & 7 deletions program/include/rcube_cache.php
Expand Up @@ -51,18 +51,23 @@ class rcube_cache
/**
* Object constructor.
*
* @param string $type Engine type ('db' or 'memcache')
* @param string $type Engine type ('db' or 'memcache' or 'apc')
* @param int $userid User identifier
* @param string $prefix Key name prefix
*/
function __construct($type, $userid, $prefix='')
{
$rcmail = rcmail::get_instance();
$type = strtolower($type);

if (strtolower($type) == 'memcache') {
if ($type == 'memcache') {
$this->type = 'memcache';
$this->db = $rcmail->get_memcache();
}
else if ($type == 'apc') {
$this->type = 'apc';
$this->db = function_exists('apc_exists'); // APC 3.1.4 required
}
else {
$this->type = 'db';
$this->db = $rcmail->get_dbh();
Expand Down Expand Up @@ -208,7 +213,17 @@ private function read_cache_record($key)
}

if ($this->type == 'memcache') {
$data = $this->db->get($this->mc_key($key));
$data = $this->db->get($this->ckey($key));

if ($data) {
$this->cache_sums[$key] = md5($data);
$data = unserialize($data);
}
return $this->cache[$key] = $data;
}

if ($this->type == 'apc') {
$data = apc_fetch($this->ckey($key));

if ($data) {
$this->cache_sums[$key] = md5($data);
Expand Down Expand Up @@ -263,13 +278,20 @@ private function write_cache_record($key, $data)
}

if ($this->type == 'memcache') {
$key = $this->mc_key($key);
$key = $this->ckey($key);
$result = $this->db->replace($key, $data, MEMCACHE_COMPRESSED);
if (!$result)
$result = $this->db->set($key, $data, MEMCACHE_COMPRESSED);
return $result;
}

if ($this->type == 'apc') {
$key = $this->ckey($key);
if (apc_exists($key))
apc_delete($key);
return apc_store($key, $data);
}

// update existing cache record
if ($this->cache_keys[$key]) {
$this->db->query(
Expand Down Expand Up @@ -314,7 +336,11 @@ private function clear_cache_record($key)
}

if ($this->type == 'memcache') {
return $this->db->delete($this->mc_key($key));
return $this->db->delete($this->ckey($key));
}

if ($this->type == 'apc') {
return apc_delete($this->ckey($key));
}

$this->db->query(
Expand All @@ -328,12 +354,12 @@ private function clear_cache_record($key)


/**
* Creates per-user Memcache key
* Creates per-user cache key (for memcache and apc)
*
* @param string $key Cache key
* @access private
*/
private function mc_key($key)
private function ckey($key)
{
return sprintf('[%d]%s', $this->userid, $key);
}
Expand Down
2 changes: 1 addition & 1 deletion program/include/rcube_imap.php
Expand Up @@ -3738,7 +3738,7 @@ private function md2annotate($entry)
/**
* Enable or disable indexes caching
*
* @param boolean $type Cache type (memcache' or 'db')
* @param boolean $type Cache type (@see rcmail::get_cache)
* @access public
*/
function set_caching($type)
Expand Down

0 comments on commit 8edb3d9

Please sign in to comment.