登录  /  注册
首页 > php教程 > php手册 > 正文

基于/dev/shm的PHP缓存类

php中文网
发布: 2016-06-06 19:40:22
原创
1611人浏览过

http://unbe.cn/php_file_system_based_cache_class/ 在《Erlang和PHP间的Socket通讯》中我提到做了 基于 /dev/shm的 缓存 实现的性能测试,这里分享一下测试中我封装的一个 基于 文件系统的 缓存 类,在Linux上只需要把根目录指向/dev/shm,就可以变成一个

http://unbe.cn/php_file_system_based_cache_class/

在《Erlang和PHP间的Socket通讯》中我提到做了基于/dev/shm的缓存实现的性能测试,这里分享一下测试中我封装的一个基于文件系统的缓存类,在Linux上只需要把根目录指向/dev/shm,就可以变成一个基于内存的缓存了,在Windows上可以用普通文件系统做测试。

需要先提醒大家一点,这个缓存类只是一个原型。只是提出基于/dev/shm的缓存实现的可能性,并不是一个完整的可以在生产环境使用的缓存类。它还有很多有待完善和测试的地方,例如:数据的失效时间功能;并发情况下同一个key的数据操作;批量移除和添加并发情况下发生;等等。

使用示例:

$data_1 = array(
  'u_id' => 1,
  'name' => 'DaDa'
);

$data_2 = array(
  'u_id' => 2,
  'name' => 'WaWa'
);

$cache = new file_cache("/dev/shm");

$cache->set("user/1/data", $data_1);  //保存数据
$cache->set("user/2/data", $data_2);  //保存数据

$result = $cache->get("user/1/data"); //获取数据

$cache->remove("user/1/data"); //删除数据

$cache->remove_by_search("user", $data_1);  //删除user节点下所有数据

登录后复制

由于/dev/shm是把内存模拟成文件系统,所以很容易就实现了层级式的缓存管理。这对合理利用内存空间是很有帮助的。比如一些针对用户的缓存,可以通过层级式的存储,在用户退出系统时全部移除。再比如一些同表的不同业务逻辑视图数据的缓存,在表更新后,也可以批量的移除。

<?php class file_cache
{
    private $root_dir;
    
    public function __construct ($root_dir)
    {
        $this->root_dir = $root_dir;
        
        if (FALSE == file_exists($this-&gt;root_dir))
        {
            mkdir($this-&gt;root_dir, 0700, true);
        }
    }
    
    public function set ($key, $value)
    {
        $key = $this-&gt;escape_key($key);
        
        $file_name = $this-&gt;root_dir . '/' . $key;
        
        $dir = dirname($file_name);
        
        if (FALSE == file_exists($dir))
        {
            mkdir($dir, 0700, true);
        }
        
        file_put_contents($file_name, serialize($value), LOCK_EX);
    }
    
    public function get ($key)
    {
        $key = $this-&gt;escape_key($key);
        
        $file_name = $this-&gt;root_dir . '/' . $key;
        
        if (file_exists($file_name))
        {
            return unserialize(file_get_contents($file_name));
        }
        
        return null;
    }
    
    public function remove ($key)
    {
        $key = $this-&gt;escape_key($key);
        
        $file = $this-&gt;root_dir . '/' . $key;
        
        if (file_exists($file))
        {
            unlink($file);
        }
    }
    
    public function remove_by_search ($key)
    {
        $key = $this-&gt;escape_key($key);
        
        $dir = $this-&gt;root_dir . '/' . $key;
        
        if (strrpos($key, '/') removeDir($dir);
        }
    }
    
    private function escape_key ($key)
    {
        return str_replace('..', '', $key);
    }
    
    function removeDir($dirName)
    {
        $result = false;
        
        $handle = opendir($dirName);
        
        while(($file = readdir($handle)) !== false)
        {
            if($file != '.' &amp;&amp; $file != '..')
            {
                $dir = $dirName . DIRECTORY_SEPARATOR . $file;
            
                is_dir($dir) ? $this-&gt;removeDir($dir) : unlink($dir);
            }
        }
        
        closedir($handle);
        
        rmdir($dirName) ? true : false;
        
        return $result;
    }
}
?&gt;
登录后复制
智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号