| 
<?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;
 }
 }
 |