* @ 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 cacheExpired[$compiledFile]=true; return true; // time-out. } } else { $this->cacheExpired[$compiledFile]=true; return true; // no file } $this->cacheExpired[$compiledFile]=false; return false; // cache active. } public function cacheStart($id="",$cacheDuration=86400) { $this->curCacheId=($id=="")?($this->curCacheId+1):$id; $this->curCacheDuration=$cacheDuration; $this->curCachePosition=strlen(ob_get_contents()); $compiledFile = $this->getCompiledFile().'_cache'.$this->curCacheId; if ($this->cacheExpired('',$id,$cacheDuration)) { $this->cacheRunning=false; } else { $this->cacheRunning=true; $content=$this->getFile($compiledFile); echo $content; } // getFile($fileName) } public function cacheEnd() { if (!$this->cacheRunning) { $txt = substr(ob_get_contents(), $this->curCachePosition); $compiledFile = $this->getCompiledFile() . '_cache' . $this->curCacheId; file_put_contents($compiledFile, $txt); } $this->cacheRunning=false; } }