fyibmsd
8/31/2016 - 4:28 AM

PHP 基于共享内存文件系统的KeyValue存储

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);
    }
}