资讯专栏INFORMATION COLUMN

PHP shared memory cache

keithyau / 3014人阅读

摘要:引子最近在写的时候,需要使用内存缓存,大家都知道有比较成熟的基于,,以及等缓存。此函数支持两种调用方式,可以设置和获取缓存。设置的时候还能一并设置缓存过期时间。如果数据过大会不能更新缓存。这样就避免了每次全部缓存导致的多余的开销。

PHP shared memory cache 引子

最近在写PHP的时候,需要使用内存缓存,大家都知道有比较成熟的基于memcached,redis,以及apc等缓存。但是不是要装插件就是要第三方软件支持。在小项目中用起来不是很方便!

实现 shmop_*

所以打算使用php的shared memory的shmop_*前缀的API来实现一个简单的缓存接口。
此函数支持两种调用方式,可以设置和获取缓存。设置的时候还能一并设置缓存过期时间。

  function cache($key, $val=null, $expire=100) {
      static $_caches = null;
      static $_shm = null;
      if ( null === $_shm ) $_shm = @shmop_open(crc32("mcache.solt"),    
          "c", 0755, config("cache.size", null, 10485760));
      if ( null === $_caches && $_shm && ($size = intval(shmop_read($_shm, 0, 10))))
          $_caches = $size ? @unserialize(@shmop_read($_shm, 10, $size)) : array();
      if (($time = time()) && $val && $expire){
          $_caches[$key] = array($time + intval($expire), $val);
          if($_shm && ($size = @shmop_write($_shm, serialize(array_filter($_caches, function($  n)use($time){return $n[0] > $time;})), 10)))
              @shmop_write($_shm, sprintf("%10d", $size), 0);
          return $val;
      }
      return (isset($_caches[$key]) && $_caches[$key][0] > $time) ? $_caches[$key][1] : null;
  }

不过有个缺点每次load cache的时候需要全部一起load,然后反序列化保存到静态数组里面。只能缓存一些比较小的数据。如果数据过大会不能更新缓存。

shm_*

后来发现PHP还有提供一个操作shared memory的API,可以使用这个API按照key value的形式存取缓存。这样就避免了每次load全部缓存导致的多余的开销。

 function shmcache($key, $val=null, $expire=100) {
     static $_shm = null;
     if ( null === $_shm ) $_shm = @shm_attach(crc32(config("mcache.solt", null, "mcac  he.solt")),
         config("cache.size", null, 10485760), 0755);
     if (($time = time()) && ($k = crc32($key)) && $val && $expire){
         shm_put_var($_shm, $k, array($time + $expire, $val));
         return $val;
     }
     return shm_has_var($_shm, $k) && ($data = shm_get_var($_shm, $k)) && $data[0] >   $time ? $data[1] : null;
 }
 

我把这两个函数和一些其他的基本函数(现在只有9个函数)放在一个utils仓库里面。也可以直接使用 composer require lloydzhou/utils 安装

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21180.html

相关文章

  • PHP shared memory cache

    摘要:引子最近在写的时候,需要使用内存缓存,大家都知道有比较成熟的基于,,以及等缓存。此函数支持两种调用方式,可以设置和获取缓存。设置的时候还能一并设置缓存过期时间。如果数据过大会不能更新缓存。这样就避免了每次全部缓存导致的多余的开销。 PHP shared memory cache 引子 最近在写PHP的时候,需要使用内存缓存,大家都知道有比较成熟的基于memcached,redis,以及...

    1fe1se 评论0 收藏0
  • Dockerfile构建PHP开发镜像:Alpine+Nginx+PHP7+Supervisor+C

    摘要:一配置目录结构一般在生产环境都是负载均衡,定时任务是单独在一个容器执行,故此是注释掉的,需要单独在定时任务容器中打开即可。与配置文件由于配置文件是监听的默认情况下监听端口。使用套接字,这避免了的开销。地址镜像地址续搭建应用部署 一、配置目录结构 showImg(https://segmentfault.com/img/bVbpo9F?w=772&h=922); 1.1 crontabs...

    张率功 评论0 收藏0
  • PHP|标准配置之php.ini (2)

    摘要: ;;;;;;;;;;;;;;;;;;; ; Module Settings ; ;;;;;;;;;;;;;;;;;;; [CLI Server] ; Whether the CLI web server uses ANSI color coding in its terminal output. cli_server.color = On [Date] ; Defines th...

    tianren124 评论0 收藏0
  • Oracle数据库4031故障分析

    Oracle数据库4031故障分析 img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%; m...

    不知名网友 评论0 收藏2316
  • Elasticsearch本地 && docker-compose 安装

    摘要:安装前的检查安装之前,你需要先安装一个较新的版本的,最好的选择是,你可以从获得官方提供的最新版本的。 安装前的检查 安装 Elasticsearch 之前,你需要先安装一个较新的版本的 Java,最好的选择是,你可以从 www.java.com 获得官方提供的最新版本的 Java。 安装JDK sudo yum install java-1.8.0-openjdk.x86_64 ...

    zhangwang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<