diff options
-rw-r--r-- | engine/lib/cache.php | 95 |
1 files changed, 94 insertions, 1 deletions
diff --git a/engine/lib/cache.php b/engine/lib/cache.php index 5a426cdee..66e467c86 100644 --- a/engine/lib/cache.php +++ b/engine/lib/cache.php @@ -65,8 +65,101 @@ * Load data from the cache using a given key. * * @param string $key + * @param int $offset + * @param int $limit * @return mixed The stored data or false. */ - abstract public function load($key); + abstract public function load($key, $offset = 0, $limit = null); + } + + /** + * @class ElggFileCache + * Store cached data in a file store. + * @author Marcus Povey <marcus@dushka.co.uk> + */ + class ElggFileCache extends ElggCache + { + /** + * Set the Elgg cache. + * + * @param string $cache_path The cache path. + * @param int $max_age Maximum age in seconds, 0 if no limit. + * @param int $max_size Maximum size of cache in seconds, 0 if no limit. + */ + function __construct($cache_path, $max_age = 0, $max_size = 0) + { + set_variable("cache_path", $cache_path); + set_variable("max_age", $max_age); + set_variable("max_size", $max_size); + + if ($cache_path=="") throw new ConfigurationException("Cache path set to nothing!"); + } + + /** + * Create and return a handle to a file. + * + * @param string $filename + * @param string $rw + */ + protected function create_file($filename, $rw = "rb") + { + // Create a filename matrix + $matrix = ""; + for ($n = 0; $n < strlen($filename); $n++) + $matrix .= $filename[$n] . "/"; + + // Create full path + $path = $this->set_variable("cache_path") . $matrix; + if (!mkdir($path, 0700, true)) throw new IOException("Could not make $path"); + + // Open the file + return fopen($path . $filename, $rw); + } + + /** + * Create a sanitised filename for the file. + * + * @param string $filename + */ + protected function sanitise_filename($filename) + { + // TODO : Writeme + + return $filename; + } + + public function save($key, $data) + { + $f = $this->create_file($this->sanitise_filename($key), "wb"); + if ($f) + { + $result = fwrite($f, $data); + fclose($f); + + return $result; + } + + return false; + } + + public function load($key, $offset = 0, $limit = null) + { + $f = $this->create_file($this->sanitise_filename($key)); + if ($f) + { + fseek($f, $offset); + $data = stream_get_contents($f, $limit, $offset); + fclose($f); + + return $data; + } + + return false; + } + + public function __destruct() + { + // TODO: Check size and age, clean up accordingly + } } ?>
\ No newline at end of file |