115 lines
2.9 KiB
PHP
115 lines
2.9 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
namespace Fastknife\Domain\Logic;
|
|
|
|
use Fastknife\Utils\CacheUtils;
|
|
|
|
class Cache
|
|
{
|
|
protected $config;
|
|
|
|
protected $driver;
|
|
|
|
protected $methodMap = [
|
|
'get' => 'get',
|
|
'set' => 'set',
|
|
'delete' => 'delete',
|
|
'has' => 'has'
|
|
];
|
|
|
|
public function __construct($config)
|
|
{
|
|
if (isset($config['method'])) {
|
|
$this->methodMap = array_merge($this->methodMap, $config['method']);
|
|
}
|
|
$this->driver = $this->getDriver($config['constructor'], $config['options']??[]);
|
|
}
|
|
|
|
public function getDriver($callback, $options)
|
|
{
|
|
if ($callback instanceof \Closure) {
|
|
$result = $callback($options);
|
|
} else if (is_object($callback)) {
|
|
$result = $callback;
|
|
} else if (is_array($callback)) {
|
|
$result = call_user_func($callback, $options);
|
|
} else if ($this->isSerialized($callback)) {
|
|
$result = unserialize($callback);
|
|
} else if (is_string($callback) && class_exists($callback)) {
|
|
$result = new $callback($options);
|
|
} else {
|
|
$result = new CacheUtils($options);
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* 是否可以被反序列化
|
|
* @param $data
|
|
* @return bool
|
|
*/
|
|
public function isSerialized($data): bool
|
|
{
|
|
if (!is_string($data)) {
|
|
return false;
|
|
}
|
|
$data = trim($data);
|
|
if ('N;' == $data) {
|
|
return true;
|
|
}
|
|
if (!preg_match('/^([adObis]):/', $data, $badions)) {
|
|
return false;
|
|
}
|
|
switch ($badions[1]) {
|
|
case 'a' :
|
|
case 'O' :
|
|
case 's' :
|
|
if (preg_match("/^{$badions[1]}:[0-9]+:.*[;}]\$/s", $data))
|
|
return true;
|
|
break;
|
|
case 'b' :
|
|
case 'i' :
|
|
case 'd' :
|
|
if (preg_match("/^{$badions[1]}:[0-9.E-]+;\$/", $data))
|
|
return true;
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public function getDriverMethod($name)
|
|
{
|
|
return $this->methodMap[$name];
|
|
}
|
|
|
|
public function get($key, $default = null)
|
|
{
|
|
$method = $this->getDriverMethod('get');
|
|
return $this->execute($method, [$key,$default]);
|
|
}
|
|
|
|
public function set($key, $value, $ttl = null)
|
|
{
|
|
$method = $this->getDriverMethod('set');
|
|
return $this->execute($method, [$key, $value, $ttl]);
|
|
}
|
|
|
|
public function delete($key)
|
|
{
|
|
$method = $this->getDriverMethod('delete');
|
|
return $this->execute($method, [$key]);
|
|
}
|
|
|
|
public function has($key)
|
|
{
|
|
$method = $this->getDriverMethod('has');
|
|
return $this->execute($method, [$key]);
|
|
}
|
|
|
|
protected function execute(string $method, array $params){
|
|
return $this->driver->$method(...$params);
|
|
}
|
|
|
|
}
|