<?php
 
/**
 
 * MultiCache class class provides a convenient way to work with caches.
 
 * It can use local file system, memcache or other external storage.
 
 *
 
 * This library is free software; you can redistribute it and/or
 
 * modify it under the terms of the GNU Lesser General Public
 
 * License as published by the Free Software Foundation; either
 
 * version 3.0 of the License, or (at your option) any later version.
 
 *
 
 * This library is distributed in the hope that it will be useful,
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 * See the GNU Lesser General Public License for more details.
 
 */
 
abstract class MultiCache {
 
    /**
 
     * Cache max size, bytes.
 
     * If maxSize == -1 use cache driver specific value for cache max size.
 
     *
 
     * @var integer
 
     */
 
    public $maxSize = 0;
 
 
    /**
 
     * Cache max items count.
 
     *
 
     * @var integer
 
     */
 
    public $maxItemsCount = 0;
 
 
    /**
 
     * Cleans cache frequency factor.
 
     *
 
     * Clean cache operation will start randomly with random factor N
 
     * if cache overflow.
 
     *
 
     * @var integer
 
     */
 
    public $cleanCacheFactor = 10;
 
 
    /**
 
     * Gets data.
 
     *
 
     * @param mixed $key     The key that will be associated with the item .
 
     * @param mixed $default Default value.
 
     *
 
     * @return mixed Stored data.
 
     */
 
    public abstract function get($key, $default = null);
 
 
    /**
 
     * Stores data.
 
     *
 
     * @param string  $key    The key that will be associated with the item.
 
     * @param mixed   $value  The variable to store.
 
     * @param integer $expire Expiration time of the item. Unix timestamp or
 
     *                        number of seconds.
 
     */
 
    public function set($key, $value, $expire = null) {
 
        // Check cache limits
 
        $err = null;
 
 
        if (($m = $this->getMaxItemsCount()) && $this->getItemsCount() >= $m) {
 
            $err = "Maximum items count attained!";
 
        }
 
 
        if (($m = $this->getMaxSize()) && $this->getSize() >= $m) {
 
            $err = "Maximum items count attained!";
 
        }
 
 
        // Check error
 
        if ($err != null) {
 
            // Check clean cache factor
 
            if ($this->cleanCacheFactor > 0 && mt_rand(0, $this->cleanCacheFactor - 1) == 0) {
 
                $this->clean();
 
 
                // Secondary check cache limits
 
                if ((!($m = $this->getMaxItemsCount()) || $this->getItemsCount() < $m) &&
 
                    (!($m = $this->getMaxSize()) || $this->getSize() < $m))
 
                {
 
                    return;
 
                }
 
            }
 
            throw new Exception($err);
 
        }
 
    }
 
 
    /**
 
     * Removes data from the cache.
 
     *
 
     * @param string $key The key that will be associated with the item.
 
     */
 
    public abstract function remove($key);
 
 
    /**
 
     * Removes all cached data.
 
     */
 
    public abstract function removeAll();
 
 
    /**
 
     * Cleans expired cached data.
 
     */
 
    public abstract function clean();
 
 
    /**
 
     * Gets items count.
 
     *
 
     * @return integer Items count
 
     */
 
    public abstract function getItemsCount();
 
 
    /**
 
     * Gets cached data size.
 
     *
 
     * @return integer Cache size, bytes.
 
     */
 
    public abstract function getSize();
 
 
    /**
 
     * Gets cache max size. If maxSize == -1 use cache driver specific value
 
     * of cache max size.
 
     *
 
     * @return integer Cache maximum size, bytes.
 
     */
 
    public function getMaxSize() {
 
        return $this->maxSize >= 0 ? $this->maxSize : $this->getTotalMaxSize();
 
    }
 
 
    /**
 
     * Gets total cache max size.
 
     *
 
     * @return integer Cache maximum size, bytes.
 
     */
 
    public function getTotalMaxSize() {
 
        return 0;
 
    }
 
 
    /**
 
     * Gets max items count.
 
     *
 
     * @return integer Maximum items count.
 
     */
 
    public function getMaxItemsCount() {
 
        return $this->maxItemsCount;
 
    }
 
}
 
 |