alecpl
2011-05-18 8edb3d9405c7d409bcabe38274cafbd5438575f6
- Add APC support in rcube_cache


5 files modified
48 ■■■■ changed files
CHANGELOG 2 ●●● patch | view | raw | blame | history
config/main.inc.php.dist 2 ●●● patch | view | raw | blame | history
program/include/rcmail.php 2 ●●● patch | view | raw | blame | history
program/include/rcube_cache.php 40 ●●●● patch | view | raw | blame | history
program/include/rcube_imap.php 2 ●●● patch | view | raw | blame | history
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
config/main.inc.php.dist
@@ -109,7 +109,7 @@
// 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.
program/include/rcmail.php
@@ -356,7 +356,7 @@
   * 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
   */
program/include/rcube_cache.php
@@ -51,17 +51,22 @@
    /**
     * 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';
@@ -208,7 +213,17 @@
        }
        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);
@@ -263,11 +278,18 @@
        }
        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
@@ -314,7 +336,11 @@
        }
        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(
@@ -328,12 +354,12 @@
    /**
     * 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);
    }
program/include/rcube_imap.php
@@ -3738,7 +3738,7 @@
    /**
     * 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)