Init
This commit is contained in:
149
backend/resources/library/cache/cache.class.php
vendored
Normal file
149
backend/resources/library/cache/cache.class.php
vendored
Normal file
@@ -0,0 +1,149 @@
|
||||
<?php
|
||||
if (!defined('PICONTROL')) exit();
|
||||
|
||||
class Cache
|
||||
{
|
||||
const FILE = 0;
|
||||
const EXECUTION = 1;
|
||||
const EXECUTION_NOCACHE = 2;
|
||||
|
||||
private $name, $lifetime, $content, $type, $stream, $loadType = self::FILE, $efFunction, $efArgs, $modificationTime = 0, $statusCode = 0;
|
||||
private $cachePath = CACHE_PATH;
|
||||
private $fileSuffix = '.cache.php';
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
if (!func_num_args() >= 3)
|
||||
{
|
||||
$this->statusCode = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
$args = func_get_args();
|
||||
$this->name = $args[0];
|
||||
$function = $args[1];
|
||||
$lifetime = 0;
|
||||
unset($args[0], $args[1]);
|
||||
$this->efFunction = $function;
|
||||
$this->efArgs = $args;
|
||||
|
||||
if (getConfig('cache:activation.cache', 'false') == 'false' || getConfig('cache:activation.'.$this->name, 'false') == 'false')
|
||||
{
|
||||
$this->loadType = self::EXECUTION_NOCACHE;
|
||||
return;
|
||||
}
|
||||
|
||||
if (($cLifetime = getConfig('cache:lifetime.'.$this->name, 0)) != 0)
|
||||
$lifetime = $cLifetime * 60;
|
||||
|
||||
if (file_exists($this->cachePath.$this->name.$this->fileSuffix) && filemtime($this->cachePath.$this->name.$this->fileSuffix) > time() - $lifetime)
|
||||
return;
|
||||
|
||||
$this->loadType = self::EXECUTION;
|
||||
}
|
||||
|
||||
private function executeFunction()
|
||||
{
|
||||
$result = call_user_func_array($this->efFunction, $this->efArgs);
|
||||
$this->setContent($result);
|
||||
}
|
||||
|
||||
public function setName($name)
|
||||
{
|
||||
$this->name = $name;
|
||||
}
|
||||
|
||||
public function setContent($content)
|
||||
{
|
||||
$this->content = serialize($content);
|
||||
|
||||
if ($this->loadType == self::FILE || $this->loadType == self::EXECUTION)
|
||||
$this->statusCode = $this->saveToFile();
|
||||
}
|
||||
|
||||
public function getContent()
|
||||
{
|
||||
return unserialize($this->content);
|
||||
}
|
||||
|
||||
public function getStatusCode()
|
||||
{
|
||||
return $this->statusCode;
|
||||
}
|
||||
|
||||
public function load()
|
||||
{
|
||||
if ($this->loadType == self::FILE)
|
||||
$this->statusCode = $this->loadFromFile();
|
||||
elseif ($this->loadType == self::EXECUTION || $this->loadType == self::EXECUTION_NOCACHE)
|
||||
$this->statusCode = $this->executeFunction();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private function saveToFile()
|
||||
{
|
||||
if (($this->stream = fopen($this->cachePath.$this->name.$this->fileSuffix, 'w')) === false)
|
||||
return 1;
|
||||
|
||||
if (flock($this->stream, LOCK_EX) === false)
|
||||
return 2;
|
||||
|
||||
if (fwrite($this->stream, $this->content) === false)
|
||||
return 3;
|
||||
|
||||
if (flock($this->stream, LOCK_UN) === false)
|
||||
return 4;
|
||||
|
||||
fclose($this->stream);
|
||||
|
||||
if (touch($this->cachePath.$this->name.$this->fileSuffix) === false)
|
||||
return 5;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private function loadFromFile()
|
||||
{
|
||||
if (!file_exists($this->cachePath.$this->name.$this->fileSuffix) || !is_writable($this->cachePath.$this->name.$this->fileSuffix))
|
||||
return 6;
|
||||
|
||||
if (($this->stream = fopen($this->cachePath.$this->name.$this->fileSuffix, 'r')) === false)
|
||||
return 7;
|
||||
|
||||
if (flock($this->stream, LOCK_SH) === false)
|
||||
return 8;
|
||||
|
||||
$data = '';
|
||||
|
||||
while (!feof($this->stream))
|
||||
$data .= fread($this->stream, 512);
|
||||
|
||||
if (flock($this->stream, LOCK_UN) === false)
|
||||
return 9;
|
||||
|
||||
fclose($this->stream);
|
||||
|
||||
$this->content = $data;
|
||||
$this->modificationTime = filemtime($this->cachePath.$this->name.$this->fileSuffix);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public function displayHint($boolean = false)
|
||||
{
|
||||
if ($this->statusCode != 0 || $this->loadType == self::EXECUTION || $this->loadType == self::EXECUTION_NOCACHE)
|
||||
return NULL;
|
||||
|
||||
if ($boolean == false)
|
||||
return '<div><span class="cached" title="'._t('Stand').': '.formatTime($this->modificationTime).'"><span>'._t('Cached').'</span><a href="?s=settings&do=cache&clear='.$this->name.'&redirect='.urlencode($_SERVER['QUERY_STRING']).'">'._t('Aktualisieren').'</a></span></div>';
|
||||
else
|
||||
return array('name' => $this->name, 'modificationTime' => $this->modificationTime);
|
||||
}
|
||||
|
||||
public function clear()
|
||||
{
|
||||
return unlink($this->cachePath.$this->name.$this->fileSuffix);
|
||||
}
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user