* @ cache([cacheid],[duration=86400]). The id is optional. The duration of the cache is in seconds
* // content here
* @ endcache()
*
* It also adds a new function (optional) to the business or logic layer
*
* if ($blade->cacheExpired('hellocache',1,5)) { //'helloonecache' =template, =1 id cache, 5=duration (seconds)
* // cache expired, so we should do some stuff (such as read from the database)
* }
*
* @package BladeOneCacheRedis
* @version 0.1 2017-12-15 NOT YET IMPLEMENTED, ITS A WIP!!!!!!!!
* @link https://github.com/EFTEC/BladeOne
* @author Jorge Patricio Castro Castillo
*/
const CACHEREDIS_SCOPEURL=1;
trait BladeOneCacheRedis
{
var $curCacheId=0;
var $curCacheDuration="";
var $curCachePosition=0;
var $cacheRunning=false;
private $cacheExpired=[]; // avoids to compare the file different times.
/** @var \Redis $redis */
var $redis;
var $redisIP='127.0.0.1';
var $redisPort=6379;
var $redisTimeOut=2.5;
var $redisConnected=false;
var $redisNamespace='bladeonecache:';
var $redisBase=0;
//
public function compileCache($expression) {
// get id of template
// if the file exists then
// compare date.
// if the date is too old then re-save.
// else
// save for the first time.
return $this->phpTag."echo \$this->cacheStart{$expression}; if(!\$this->cacheRunning) { ?>";
}
public function compileEndCache($expression) {
return $this->phpTag."} // if cacheRunning\necho \$this->cacheEnd{$expression}; ?>";
}
//
public function connect($redisIP=null,$redisPort=null,$redisTimeOut=null) {
if ($this->redisConnected) return true;
if (!class_exists('Redis')) return false; // it requires redis.
if ($redisIP!==null) {
$this->redisIP=$redisIP;
$this->redisPort=$redisPort;
$this->redisTimeOut=$redisTimeOut;
}
$this->redis = new \Redis();
$this->redisConnected=$this->redis->connect($this->redisIP, $this->redisPort, $this->redisTimeOut); // 2.5 sec timeout.
return $this->redisConnected;
}
private function keyByScope($scope) {
$key='';
if ($scope && CACHEREDIS_SCOPEURL) {
$key.=$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
}
}
/**
* Returns true if the cache expired (or doesn't exist), otherwise false.
* @param string $templateName name of the template to use (such hello for template hello.blade.php)
* @param string $id (id of cache, optional, if not id then it adds automatically a number)
* @param int $scope scope of the cache.
* @param int $cacheDuration (duration of the cache in seconds)
* @return bool (return if the cache expired)
*/
public function cacheExpired($templateName,$id,$scope,$cacheDuration) {
if ($this->getMode() & 1) {
return true; // forced mode, hence it always expires. (fast mode is ignored).
}
$compiledFile = $this->getCompiledFile($templateName).'_cache'.$id;
if (isset($this->cacheExpired[$compiledFile])) {
// if the information is already in the array then returns it.
return $this->cacheExpired[$compiledFile];
}
$date=@filemtime($compiledFile);
if ($date) {
if ($date+$cacheDuration