<?php
namespace Jackbooted\Util;
/**
* @copyright Confidential and copyright (c) 2016 Jackbooted Software. All rights reserved.
*
* Written by Brett Dutton of Jackbooted Software
* brett at brettdutton dot com
*
* This software is written and distributed under the GNU General Public
* License which means that its source code is freely-distributed and
* available to the general public.
*/
class DataCache extends \Jackbooted\Util\JB {
private static $log;
public static function init () {
self::$log = new Log4PHP ( __CLASS__ );
}
private $timeStamps = [];
private $hits = [];
private $cache = [];
private $maxSize = 0;
private $cacheHits = 0;
private $cacheMisses = 0;
private $name = 0;
public function __construct( $name, $size=0 ) {
parent::__construct();
$this->maxSize = $size;
$this->name = $name;
}
public function __destruct() {
$msg = "Cache[{$this->name}][CacheHits]={$this->cacheHits} [CacheMisses]={$this->cacheMisses}";
self::$log->trace ( $msg );
// I have commented this out incase you are interested in statistics
//echo $msg . "<br/>\n";
//foreach ( $this->timeStamps as $key => $val ) {
// echo $key . " Hits:" . $this->hits[$key] . "<br/>\n";
//}
}
public function set ( $key, $value ) {
if ( ! isset ( $this->cache[$key] ) &&
$this->maxSize > 0 &&
count ( $this->cache ) >= $this->maxSize ) {
$this->removeOldestCacheValue ();
}
$this->cache[$key] = $value;
$this->touch ( $key );
}
public function clear ( ) {
$this->timeStamps = [];
$this->cache = [];
}
public function removeOldestCacheValue () {
$maxTime = time ();
$maxKey = '';
foreach ( $this->timeStamps as $key => $val ) {
if ( $val <= $maxTime ) {
$maxTime = $val;
$maxKey = $key;
}
}
unset ( $this->timeStamps[$maxKey] );
unset ( $this->cache[$maxKey] );
}
public function get ( $key ) {
if ( isset ( $this->cache[$key] ) ) {
$this->touch ( $key );
$this->cacheHits ++;
return $this->cache[$key];
}
else {
$this->cacheMisses ++;
return false;
}
}
private function touch ( $key ) {
$this->timeStamps[$key] = time ();
if ( isset ( $this->hits[$key] ) ) {
$this->hits[$key] ++;
}
else {
$this->hits[$key] = 1;
}
}
}
|