http://eslizn.com/post/php-data-cache-for-shmop.html

今天上课时研究了下PHP的数据缓存,根据网上的资料,一般采用serialize序列化存储,读取时将数据通过unserialize将数据反序列化还原.

接着,缓存一般存储在文件或者内存中.在大型应用中,一般是将模板缓存和数据缓存分割开来的,而且是将模板缓存以文件的形式缓存,数据使用内存来缓存.这样的架构能在很大程度上减轻数据库和程序的压力.

关于php操作内存,我选择了shmop扩展,其方法只有6个:

  • shmop_open 打开内存块.
  • shmop_write 向内存块中写入数据
  • shmop_size 获得内存块大小
  • shmop_read 读取内存块数据
  • shmop_delete 删除内存块数据
  • shmop_close 关闭内存块
打开内存块使用shmop_open 成功返回shmid,失败返回false:
1
int shmop_open ( int $key , string $flags , int $mode , int $size )
参数$key是用来标识共享内存段的,一般使用ftok函数生成.
参数$flags是内存段属性:
  • a:只读内存段
  • c:读写内存段,如果内存段不存在则创建
  • w:读写内存段
  • n:创建一个新的内存段,如果已经存在则返回失败.
参数$mode是内存段访问权限,采用八进制数据,如0664
参数$size是内存段大小.

向内存段中写入数据shmop_write 成功返回写入数据大小,失败返回false:
1
int shmop_write ( int $shmid , string $data , int $offset )
参数$shmid是使用shmop_open返回的一个id.
参数$data是要写入的数据.
参数$offset是写入数据的偏移量.
从内存段中读取数据使用shmop_read 成功返回数据,失败返回false
1
string shmop_read ( int $shmid , int $start , int $count )
参数$shmid是使用shmop_open返回的一个id.
参数$start是要读取数据在内存段中的起始位置.
参数$count是要读取的数据长度.
获取内存段的数据大小使用shmop_size 返回数据长度
1
int shmop_size ( int $shmid )
参数$shmid是使用shmop_open返回的一个id.
删除内存段使用shmop_delete 成功返回true,失败返回false
1
bool shmop_delete ( int $shmid )
参数$shmid是使用shmop_open返回的一个id.
关闭内存段使用shmop_close
1
void shmop_close ( int $shmid )
参数$shmid是使用shmop_open返回的一个id.
/*

 *  Memcache 内存缓存模块
 *          init()          初始化
 *      get($key)       获取数据
 *      set($key,$val)      存储数据
 *      del($key)       删除数据
 *      close()         关闭内存段
 *  Author Eslizn http://eslizn.com  at 2011-12-17
*/
class Memcache
{
    public static $list=array();
    public static function init()
    {
        //Memcache::close();
    }
    public static function get($key)
    {
        if(isset(Memcache::$list[$key]))
        {
            return unserialize(shmop_read(Memcache::$list[$key],0,shmop_size(Memcache::$list[$key])));
        }
        return false;
    }
    public static function set($key,$val)
    {
        $val=serialize($val);
        if(isset(Memcache::$list[$key]))
        {
            shmop_close(Memcache::$list[$key]);
        }
        Memcache::$list[$key] = shmop_open(ftok(__FILE__, $key),"c",0664,strlen($val));
        shmop_write(Memcache::$list[$key],$val,0);
        return true;
    }
    public static function del($key)
    {
        if(isset(Memcache::$list[$key]))
        {
            return shmop_delete(Memcache::$list[$key]);
        }
    }
    public static function close()
    {
        while(!empty(Memcache::$list))
        {
            shmop_close(array_pop(Memcache::$list));
        }
        return true;
    }
}

php实现基于shmop扩展的数据缓存相关推荐

  1. ios开发循环网络请求_GitHub - JadenTeng/ResourceX: iOS网络请求,网络泛型编程,工具类的封装,基于AFNetworking 实现, NSCache数据缓存...

    ResourceX 通过AFNetworking.YYModel 解析网络泛型编程简化网络请求 现如今,网络通信几乎涉及每一个app程序.对于绝大多数请求HTTP API的方法,它们的执行流程都可以分 ...

  2. ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法

    ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法 一.前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类 ...

  3. 深入云原生 AI:基于 Alluxio 数据缓存的大规模深度学习训练性能优化

    作者 | 车漾(阿里云高级技术专家).顾荣(南京大学 副研究员) 导读:Alluxio 项目诞生于 UC Berkeley AMP 实验室,自开源以来经过 7 年的不断开发迭代,支撑大数据处理场景的数 ...

  4. 【深度学习】基于 Alluxio 数据缓存的性能优化

    作者 | 车漾(阿里云高级技术专家).顾荣(南京大学 副研究员) 导读:Alluxio 项目诞生于 UC Berkeley AMP 实验室,自开源以来经过 7 年的不断开发迭代,支撑大数据处理场景的数 ...

  5. 阿里云原生实践:基于 Alluxio 数据缓存的大规模深度学习训练性能优化

    导读:Alluxio 项目诞生于 UC Berkeley AMP 实验室,自开源以来经过 7年的不断开发迭代,支撑大数据处理场景的数据统一管理和高效缓存功能日趋成熟.然而,随着云原生人工智能(Clou ...

  6. 基于ICN的数据缓存

    什么是数据缓存? • 在每个 ICN 路由器的 CS 中输入一个条目. • 格式(前缀,二进制数据). • 使用缓存,无需费心向具有原始内容的服务器发送请求. • 缓存哪些数据取决于算法. • 此外, ...

  7. 如何基于java代理对大数据缓存组件返回的数据进行脱敏和阻断

    如何基于java代理对大数据缓存组件返回的数据进行脱敏和阻断 背景 架构拓扑图 实现方式对比 UDF方案 优点: 缺点: 改写返回结果方案 优点: 缺点: 说明 实现 默认处理方式 redis报文解析 ...

  8. PHP扩展安装与使用系列教程(39) --- yac 用户数据缓存插件

    yac 用户数据缓存插件 假设 可自定义 php 安装目录: /root/php/bin/php74 php 超链接目录路径 : /usr/bin 源码目录 : /root/php/packages ...

  9. 用Apache Ignite实现可扩展的数据网格

    在本文中,我们将先介绍数据网格(Data Grid)的基本概念.属性.以及能够提供的服务,然后讨论如何设计可扩展的数据网格,以满足实际场景的业务需求. 什么是数据网格? 数据网格是一组能够提供共享数据 ...

最新文章

  1. python3 zipfile模块 zip压缩解压
  2. 请问:hive中avg聚合函数会使用到combiner功能吗?
  3. Matlab图形用户界面编程初级入门
  4. CINNO:2025年全球折叠屏智能手机销量有望超5700万部
  5. poj 动态规划总结
  6. 怒爬某 Hub 资源就为撸了一个鉴黄平台
  7. 软件开发中的需求种类
  8. [辅助工具] 【羽睿】Proxmark3 Easy Gui 4.0 5.0 5.1加强版 PM3GUI_X稳定优化版
  9. TL-WAN726N_V2_免驱版Win10开启AP网络
  10. java iv不是内部命令_java – 解密错误:“no iv set when one expected”
  11. c语言中calc用法,CSS中calc()函数怎么使用
  12. Effective Java(第三版) 学习笔记 - 第六章 枚举和注解 Rule34~Rule41
  13. 多维尺度分析MDS详解
  14. 【CF #797 Div3】A-E
  15. 数据结构教程(第五版 李春葆 上机实验题3 验证性实验)
  16. 为什么 Java 与 Python 在对待成员变量的访问控制方式截然相反?
  17. 一文读懂多分类的评价指标(微平均、宏平均、加权平均)
  18. 没有思考的生活是走向迷失自己的开始
  19. Centos执行.sh文件
  20. Unity中 批量设置成 预制体

热门文章

  1. 「小程序JAVA实战」小程序视频上传方法的抽象复用(57)
  2. 第四章 .net core做一个简单的登录
  3. Redis的字典扩容与ConcurrentHashMap的扩容策略比较
  4. 挖一挖不常用到而又很实用的重载-Trim
  5. ios ---常用的图片处理技术
  6. 常见字符串拼接性能比较
  7. Ant 条件判断 if
  8. cacti由cmd.php更换成spine后无法绘图
  9. len(x) 击败 x.len(),从内置函数看 Python 的设计思想
  10. 任正非督战:华为强攻公有云业务 竞争残酷