From fec2d8e1309d1f16f9cd772b82b28627d9359354 Mon Sep 17 00:00:00 2001 From: thomascube Date: Tue, 21 Feb 2012 21:43:39 +0000 Subject: Refactored IMAP cache expunge: delegate to storage object; don't rely on deprecated 'enable_caching' config option --- program/include/main.inc | 27 --------------------------- program/include/rcmail.php | 21 ++++++++++++++++++--- program/include/rcube_imap.php | 17 ++++++++++++++++- program/include/rcube_imap_cache.php | 21 +++++++++++++++++++++ program/include/rcube_session.php | 11 ++++++++--- program/include/rcube_storage.php | 5 +++++ 6 files changed, 68 insertions(+), 34 deletions(-) diff --git a/program/include/main.inc b/program/include/main.inc index 1e84e2dfb..68719e895 100644 --- a/program/include/main.inc +++ b/program/include/main.inc @@ -158,33 +158,6 @@ function rcmail_temp_gc() } -/** - * Garbage collector for cache entries. - * Remove all expired message cache records - * @return void - */ -function rcmail_cache_gc() -{ - $rcmail = rcmail::get_instance(); - $db = $rcmail->get_dbh(); - - // get target timestamp - $ts = get_offset_time($rcmail->config->get('message_cache_lifetime', '30d'), -1); - - $db->query("DELETE FROM ".get_table_name('cache_messages') - ." WHERE changed < " . $db->fromunixtime($ts)); - - $db->query("DELETE FROM ".get_table_name('cache_index') - ." WHERE changed < " . $db->fromunixtime($ts)); - - $db->query("DELETE FROM ".get_table_name('cache_thread') - ." WHERE changed < " . $db->fromunixtime($ts)); - - $db->query("DELETE FROM ".get_table_name('cache') - ." WHERE created < " . $db->fromunixtime($ts)); -} - - // Deprecated function rcube_charset_convert($str, $from, $to=NULL) { diff --git a/program/include/rcmail.php b/program/include/rcmail.php index 3d5915ea5..9d1190ad6 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -129,6 +129,7 @@ class rcmail private $caches = array(); private $action_map = array(); private $shutdown_functions = array(); + private $expunge_cache = false; /** @@ -767,8 +768,7 @@ class rcmail $this->session = new rcube_session($this->get_dbh(), $this->config); $this->session->register_gc_handler('rcmail_temp_gc'); - if ($this->config->get('enable_caching')) - $this->session->register_gc_handler('rcmail_cache_gc'); + $this->session->register_gc_handler(array($this, 'cache_gc')); // start PHP session (if not in CLI mode) if ($_SERVER['REMOTE_ADDR']) @@ -1278,8 +1278,11 @@ class rcmail $cache->close(); } - if (is_object($this->storage)) + if (is_object($this->storage)) { + if ($this->expunge_cache) + $this->storage->expunge_cache(); $this->storage->close(); + } // before closing the database connection, write session data if ($_SERVER['REMOTE_ADDR'] && is_object($this->session)) { @@ -1315,6 +1318,18 @@ class rcmail } + /** + * Garbage collector for cache entries. + * Set flag to expunge caches on shutdown + */ + function cache_gc() + { + // because this gc function is called before storage is initialized, + // we just set a flag to expunge storage cache on shutdown. + $this->expunge_cache = true; + } + + /** * Generate a unique token to be used in a form request * diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php index 56b5e59fe..70b410ff8 100644 --- a/program/include/rcube_imap.php +++ b/program/include/rcube_imap.php @@ -3527,7 +3527,8 @@ class rcube_imap extends rcube_storage { if ($this->caching && !$this->cache) { $rcmail = rcmail::get_instance(); - $this->cache = $rcmail->get_cache('IMAP', $this->caching); + $ttl = $rcmail->config->get('message_cache_lifetime', '10d') - mktime(); + $this->cache = $rcmail->get_cache('IMAP', $this->caching, $ttl); } return $this->cache; @@ -3574,6 +3575,20 @@ class rcube_imap extends rcube_storage } } + /** + * Delete outdated cache entries + */ + public function expunge_cache() + { + if ($this->mcache) { + $ttl = rcmail::get_instance()->config->get('message_cache_lifetime', '10d'); + $this->mcache->expunge($ttl); + } + + if ($this->cache) + $this->cache->expunge(); + } + /* -------------------------------- * message caching methods diff --git a/program/include/rcube_imap_cache.php b/program/include/rcube_imap_cache.php index 96c49f713..655979de6 100644 --- a/program/include/rcube_imap_cache.php +++ b/program/include/rcube_imap_cache.php @@ -598,6 +598,27 @@ class rcube_imap_cache } + /** + * Delete cache entries older than TTL + * + * @param string $ttl Lifetime of message cache entries + */ + function expunge($ttl) + { + // get expiration timestamp + $ts = get_offset_time($ttl, -1); + + $this->db->query("DELETE FROM ".get_table_name('cache_messages') + ." WHERE changed < " . $this->db->fromunixtime($ts)); + + $this->db->query("DELETE FROM ".get_table_name('cache_index') + ." WHERE changed < " . $this->db->fromunixtime($ts)); + + $this->db->query("DELETE FROM ".get_table_name('cache_thread') + ." WHERE changed < " . $this->db->fromunixtime($ts)); + } + + /** * Fetches index data from database */ diff --git a/program/include/rcube_session.php b/program/include/rcube_session.php index 1f5290c71..5ec9f337f 100644 --- a/program/include/rcube_session.php +++ b/program/include/rcube_session.php @@ -332,10 +332,15 @@ class rcube_session * * @param mixed Callback function */ - public function register_gc_handler($func_name) + public function register_gc_handler($func) { - if ($func_name && !in_array($func_name, $this->gc_handlers)) - $this->gc_handlers[] = $func_name; + foreach ($this->gc_handlers as $handler) { + if ($handler == $func) { + return; + } + } + + $this->gc_handlers[] = $func; } diff --git a/program/include/rcube_storage.php b/program/include/rcube_storage.php index 54e58ecf2..cef773c82 100644 --- a/program/include/rcube_storage.php +++ b/program/include/rcube_storage.php @@ -971,6 +971,11 @@ abstract class rcube_storage */ abstract function get_cache($key); + /** + * Delete outdated cache entries + */ + abstract function expunge_cache(); + } // end class rcube_storage -- cgit v1.2.3