diff options
author | Aleksander Machniak <alec@alec.pl> | 2013-06-05 10:56:26 +0200 |
---|---|---|
committer | Aleksander Machniak <alec@alec.pl> | 2013-06-05 10:56:26 +0200 |
commit | ee73a723f9fb3d51927b60f6bc38b277adcf58e9 (patch) | |
tree | 594fa8ec279115d091aacade3019cf5d9a5283f3 | |
parent | 42de33c7dee0dc48e54d317eefd4dac18c317e42 (diff) |
Improvements in garbage collector: created gc() method to run all
gc-related cleanups in one place, added posibility to run gc in
environments without session
-rwxr-xr-x | bin/gc.sh | 3 | ||||
-rw-r--r-- | program/include/bc.php | 2 | ||||
-rw-r--r-- | program/lib/Roundcube/rcube.php | 56 |
3 files changed, 47 insertions, 14 deletions
@@ -24,5 +24,4 @@ define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' ); require INSTALL_PATH.'program/include/clisetup.php'; $rcmail = rcube::get_instance(); -$rcmail->temp_gc(); -$rcmail->cache_gc(); +$rcmail->gc(); diff --git a/program/include/bc.php b/program/include/bc.php index 447876d37..a7d7b5ac1 100644 --- a/program/include/bc.php +++ b/program/include/bc.php @@ -62,7 +62,7 @@ function rcmail_url($action, $p=array(), $task=null) function rcmail_temp_gc() { - rcmail::get_instance()->temp_gc(); + rcmail::get_instance()->gc_temp(); } function rcube_charset_convert($str, $from, $to=NULL) diff --git a/program/lib/Roundcube/rcube.php b/program/lib/Roundcube/rcube.php index 4e3f8fcf4..ebfa4f8aa 100644 --- a/program/lib/Roundcube/rcube.php +++ b/program/lib/Roundcube/rcube.php @@ -462,9 +462,7 @@ class rcube // use database for storing session data $this->session = new rcube_session($this->get_dbh(), $this->config); - $this->session->register_gc_handler(array($this, 'temp_gc')); - $this->session->register_gc_handler(array($this, 'cache_gc')); - + $this->session->register_gc_handler(array($this, 'gc_handler')); $this->session->set_secret($this->config->get('des_key') . dirname($_SERVER['SCRIPT_NAME'])); $this->session->set_ip_check($this->config->get('ip_check')); @@ -476,10 +474,29 @@ class rcube /** + * Garbage collector - cache/temp cleaner + */ + public function gc() + { + foreach ($this->caches as $cache) { + if (is_object($cache)) { + $cache->expunge(); + } + } + + if (is_object($this->storage)) { + $this->storage->expunge_cache(); + } + + $this->gc_temp(); + } + + + /** * Garbage collector function for temp files. * Remove temp files older than two days */ - public function temp_gc() + public function gc_temp() { $tmp = unslashify($this->config->get('temp_dir')); $expire = time() - 172800; // expire in 48 hours @@ -504,7 +521,7 @@ class rcube * Garbage collector for cache entries. * Set flag to expunge caches on shutdown */ - public function cache_gc() + public function gc_handler() { // because this gc function is called before storage is initialized, // we just set a flag to expunge storage cache on shutdown. @@ -513,6 +530,25 @@ class rcube /** + * Runs garbage collector with probability based on + * session settings. This is intended for environments + * without a session. + */ + public function gc_run() + { + $probability = (int) ini_get('session.gc_probability'); + $divisor = (int) ini_get('session.gc_divisor'); + + if ($divisor > 0 && $probability > 0) { + $random = mt_rand(1, $divisor); + if ($random <= $probability) { + $this->gc(); + } + } + } + + + /** * Get localized text in the desired language * * @param mixed $attrib Named parameters array or label name @@ -896,19 +932,17 @@ class rcube $this->smtp->disconnect(); } + if ($this->expunge_cache) { + $this->gc(); + } + foreach ($this->caches as $cache) { if (is_object($cache)) { - if ($this->expunge_cache) { - $cache->expunge(); - } $cache->close(); } } if (is_object($this->storage)) { - if ($this->expunge_cache) { - $this->storage->expunge_cache(); - } $this->storage->close(); } } |