| 
<?php
 /*
 *Please make sure that you're using the last version by checking http://code.google.com/p/boxcache
 */
 
 class boxcache {
 
 protected $path;
 protected $cache;
 protected $debug = false;
 protected $messages = array();
 protected $autoclean = false;
 
 public function __construct($path = null) {
 if (is_dir($path) && is_writable($path)) {
 $path = str_replace('\\', '/', $path);
 $path = (substr($path, -1, 1) == '/') ? $path : $path . '/';
 $this->path = $path;
 $this->trowDebug('The script was sucefully configured, your working path is: ' . $path, 2);
 } else {
 $this->trowDebug('You need to enter a valid and writable path to cache files. The path ' . $path . ' is invalid or not writable.', 1);
 }
 }
 
 public function write($name, $data, $expire = null) {
 if ($this->autoclean == true) {
 $this->clean();
 }
 
 if (empty($name) || empty($data)) {
 $this->trowDebug('You are required to enter a valid name for the cache and a valid data to be cached.', 1);
 return false;
 } else {
 $cache['filename'] = md5($name);
 $cache['data'] = base64_encode(serialize($data));
 $cache['expire'] = empty($expire) ? date('Y-m-d H:i:s', strtotime('+15 minutes')) : date('Y-m-d H:i:s', strtotime($expire));
 $this->cache = $cache;
 $caching = $this->putContents();
 if ($caching == true) {
 $this->trowDebug($name . ' have been sucefully cached.', 2);
 return true;
 } else {
 $this->trowDebug('Something went wrong wen the script tryed to cache ' . $name, 1);
 return false;
 }
 }
 }
 
 public function get($name) {
 if (!empty($name)) {
 $data = $this->getContents(md5($name));
 if ($data != false) {
 $data = explode('::', $data);
 if ($data[0] >= date('Y-m-d H:i:s')) {
 $this->trowDebug($name . ' was succefully returned from the cache.', 2, $data[1]);
 return unserialize(base64_decode($data[1]));
 } else {
 if (file_exists($this->path . $name . '.cache')) {
 $this->trowDebug($name . ' has expired, the file ' . $this->path . md5($name) . '.cache' . ' will be deleted now.', 4);
 unlink($this->path . md5($name) . '.cache');
 }
 $this->trowDebug($name . ' has expired.', 4);
 return false;
 }
 } else {
 $this->trowDebug('Something went wrong wen the script tryed to get the cache ' . $name, 1);
 return false;
 }
 } else {
 $this->trowDebug('The name parameter can\'t be empty.', 1);
 return false;
 }
 }
 
 protected function putContents() {
 if (!file_exists($this->path . $this->cache['filename'] . '.cache')) {
 file_put_contents($this->path . $this->cache['filename'] . '.cache', $this->cache['expire'] . '::' . $this->cache['data']);
 $this->trowDebug($this->cache['filename'] . ' was succefully cached', 2, $this->cache['data']);
 return true;
 } else {
 $this->trowDebug('The file ' . $this->path . $this->cache['filename'] . '.cache' . 'already exists, skiping cache.', 4, $this->cache['data']);
 return false;
 }
 }
 
 protected function getContents($name) {
 if (file_exists($this->path . $name . '.cache')) {
 $this->trowDebug('The file ' . $this->path . $name . '.cache' . ' have been readed succefully.', 2);
 return file_get_contents($this->path . $name . '.cache');
 } else {
 $this->trowDebug('The file ' . $this->path . $name . '.cache' . ' doesn\'t exists, skiping.', 4);
 return false;
 }
 }
 
 public function delete($name) {
 if (file_exists($this->path . md5($name) . '.cache')) {
 $this->trowDebug('The file ' . $this->path . md5($name) . '.cache' . ' have been deleted succefully.', 2);
 unlink($this->path . md5($name) . '.cache');
 return true;
 } else {
 $this->trowDebug('The file ' . $this->path . md5($name) . '.cache' . ' doesn\'t exists, skiping.', 4);
 return false;
 }
 }
 
 public function purge() {
 $files = array_slice(scandir($this->path), 2);
 if (!empty($files)) {
 foreach ($files as $file) {
 if (file_exists($this->path . $file) && stripos('.cache', $file) != false) {
 $this->trowDebug('The file ' . $this->path . $file . ' have been deleted succefully.', 2);
 unlink($this->path . $file);
 }
 }
 } else {
 $this->trowDebug('There is no files to be erased in the work path.', 4);
 }
 }
 
 public function clean() {
 $files = array_slice(scandir($this->path), 2);
 if (!empty($files)) {
 foreach ($files as $file) {
 if (file_exists($this->path . $file) && stripos('.cache', $file) != false) {
 $data = file_get_contents($this->path . $file);
 $data = explode('::', $data);
 if ($data[0] <= date('Y-m-d H:i:s')) {
 $this->trowDebug('The file ' . $this->path . $file . ' have been cleaned succefully.', 2);
 unlink($this->path . $file);
 }
 }
 }
 } else {
 $this->trowDebug('There is no files to be cleaned in the work path.', 4);
 }
 }
 
 public function enableDebug() {
 $this->debug = true;
 $this->trowDebug('Debug enabled.', 4);
 }
 
 public function disableDebug() {
 $this->debug = false;
 $this->trowDebug('Debug disabled.', 4);
 }
 
 public function debug() {
 return $this->messages;
 }
 
 protected function trowDebug($msg, $level = 4, $serialize = null) {
 
 $levels = array(
 0 => 'unknown',
 1 => 'error',
 2 => 'success',
 3 => 'warning',
 4 => 'info'
 );
 
 if (!empty($msg) && $this->debug == true) {
 
 $microseconds = microtime();
 $microseconds = explode(' ', $microseconds);
 $microseconds = $microseconds[0];
 
 $this->messages[] = array(
 'level' => array_key_exists($level, $levels) ? $levels[$level] : $levels[0],
 'message' => $msg,
 'timestamp' => date('Y-m-d H:i:s') . ' (' . $microseconds . ')',
 'data' => !empty($serialize) ? serialize($serialize) : null,
 );
 }
 }
 
 }
 
 ?>
 
 |