first commit
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
<?php
|
||||
|
||||
namespace Analyst\Cache;
|
||||
|
||||
use Analyst\Contracts\CacheContract;
|
||||
|
||||
/**
|
||||
* Class DatabaseCache
|
||||
*
|
||||
* @since 1.1.5
|
||||
*/
|
||||
class DatabaseCache implements CacheContract
|
||||
{
|
||||
const OPTION_KEY = 'analyst_cache';
|
||||
|
||||
protected static $instance;
|
||||
|
||||
/**
|
||||
* Get instance of db cache
|
||||
*
|
||||
* @return DatabaseCache
|
||||
*/
|
||||
public static function getInstance()
|
||||
{
|
||||
if (!self::$instance) {
|
||||
self::$instance = new DatabaseCache();
|
||||
}
|
||||
|
||||
return self::$instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Key value pair
|
||||
*
|
||||
* @var array[]
|
||||
*/
|
||||
protected $values = [];
|
||||
|
||||
/**
|
||||
* DatabaseCache constructor.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$raw = get_option(self::OPTION_KEY, serialize([]));
|
||||
|
||||
// Raw data may be an array already
|
||||
$this->values = is_array($raw) ? $raw : @unserialize($raw);
|
||||
|
||||
// In case serialization is failed
|
||||
// make sure values is an array
|
||||
if (!is_array($this->values)) {
|
||||
$this->values = [];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Save value with given key
|
||||
*
|
||||
* @param string $key
|
||||
* @param string $value
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function put($key, $value)
|
||||
{
|
||||
$this->values[$key] = $value;
|
||||
|
||||
$this->sync();
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get value by given key
|
||||
*
|
||||
* @param $key
|
||||
*
|
||||
* @param null $default
|
||||
* @return string
|
||||
*/
|
||||
public function get($key, $default = null)
|
||||
{
|
||||
$value = isset($this->values[$key]) ? $this->values[$key] : $default;
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $key
|
||||
*
|
||||
* @return static
|
||||
*/
|
||||
public function delete($key)
|
||||
{
|
||||
if (isset($this->values[$key])) {
|
||||
unset($this->values[$key]);
|
||||
|
||||
$this->sync();
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update cache in DB
|
||||
*/
|
||||
protected function sync()
|
||||
{
|
||||
update_option(self::OPTION_KEY, serialize($this->values));
|
||||
}
|
||||
|
||||
/**
|
||||
* Should get value and remove it from cache
|
||||
*
|
||||
* @param $key
|
||||
* @param null $default
|
||||
* @return mixed
|
||||
*/
|
||||
public function pop($key, $default = null)
|
||||
{
|
||||
$value = $this->get($key);
|
||||
|
||||
$this->delete($key);
|
||||
|
||||
return $value;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user