php shared memory,PHP shared memory cache

本文介绍了在PHP中实现内存缓存的两种方法,分别是使用shmop_* API和shm_*/shm_attach。作者在小项目中避免使用memcached、redis和apc等外部依赖,通过PHP内置的共享内存功能创建了一个简单的缓存接口。文章详细展示了如何设置和获取缓存,并分析了不同方法的优缺点,适合对PHP内存缓存感兴趣的开发者阅读。
摘要由CSDN通过智能技术生成

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 安装

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值