PHP 基于共享内存文件系统的KeyValue存储
<?php
class Storage
{
public static $shmDir = '/dev/shm';
public static $separator = ':';
protected $baseDir;
protected $mode;
public function __construct($subdir = 'storage', $mode = 0777)
{
$this->baseDir = self::$shmDir . '/' . $subdir;
$this->mode = $mode;
if (!is_dir($this->baseDir)) {
mkdir($this->baseDir, $this->mode, true);
}
}
protected function getFile($key)
{
$file = $this->baseDir . '/' . str_replace(self::$separator, '/', trim($key, self::$separator));
$dir = dirname($file);
if (!is_dir($dir)) {
mkdir($dir, $this->mode, true);
}
return $file;
}
public function get($key)
{
$file = $this->getFile($key);
if (!is_file($file)) {
return false;
}
$res = file_get_contents($file, LOCK_SH);
if ($res) {
return unserialize($res);
} else {
return false;
}
}
public function set($key, $value)
{
$file = $this->getFile($key);
if (file_put_contents($file, serialize($value), LOCK_EX) === false) {
return false;
} else {
return true;
}
}
public function exists($key)
{
return is_file($this->getFile($key));
}
public function scan($prefix)
{
$dir = $this->baseDir . '/' . str_replace(self::$separator, '/', trim($prefix, self::$separator));
if (!is_dir($dir)) {
return false;
}
return scandir($dir);
}
public function del($key)
{
if (!$this->exists($key)) {
return false;
}
$file = $this->getFile($key);
return unlink($file);
}
}