Heim >Backend-Entwicklung >PHP-Tutorial >PHP shared memory cache

PHP shared memory cache

WBOY
WBOYOriginal
2016-06-23 13:24:281003Durchsuche

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(ftok('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,然后反序列化保存到静态数组里面。只能缓存一些比较小的数据。如果数据过大会不能更新缓存。

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn