* @ 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 < time() ) {
$this->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 esc_html__( $content, ATKP_PLUGIN_PREFIX );
}
// 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;
}
}