2024年PHP开发者大会(日本)

共享内存

添加注释

用户贡献的注释 2 个注释

makr at makrit dot net
11年前
简化的 shmop
$test=get_cache('test');
save_cache($test, 'test1', 600);

要轻松保存/获取缓存,只需将其保存为 cache.php 或您认为合适的任何名称

<?php

function save_cache($data, $name, $timeout) {
// 删除缓存
$id=shmop_open(get_cache_id($name), "a", 0, 0);
shmop_delete($id);
shmop_close($id);

// 获取缓存名称的 ID
$id=shmop_open(get_cache_id($name), "c", 0644, strlen(serialize($data)));

// 返回数据大小的整数或布尔值 false 表示失败
if ($id) {
set_timeout($name, $timeout);
return
shmop_write($id, serialize($data), 0);
}
else return
false;
}

function
get_cache($name) {
if (!
check_timeout($name)) {
$id=shmop_open(get_cache_id($name), "a", 0, 0);

if (
$id) $data=unserialize(shmop_read($id, 0, shmop_size($id)));
else return
false; // 加载数据失败

if ($data) { // 检索到数组
shmop_close();
return
$data;
}
else return
false; // 加载数据失败
}
else return
false; // 数据已过期
}

function
get_cache_id($name) {
// 在此处维护缓存列表
$id=array( 'test1' => 1
'test2' => 2
);

return
$id[$name];
}

function
set_timeout($name, $int) {
$timeout=new DateTime(date('Y-m-d H:i:s'));
date_add($timeout, date_interval_create_from_date_string("$int seconds"));
$timeout=date_format($timeout, 'YmdHis');

$id=shmop_open(100, "a", 0, 0);
if (
$id) $tl=unserialize(shmop_read($id, 0, shmop_size($id)));
else
$tl=array();
shmop_delete($id);
shmop_close($id);

$tl[$name]=$timeout;
$id=shmop_open(100, "c", 0644, strlen(serialize($tl)));
shmop_write($id, serialize($tl), 0);
}

function
check_timeout($name) {
$now=new DateTime(date('Y-m-d H:i:s'));
$now=date_format($now, 'YmdHis');

$id=shmop_open(100, "a", 0, 0);
if (
$id) $tl=unserialize(shmop_read($id, 0, shmop_size($id)));
else return
true;
shmop_close($id);

$timeout=$tl[$name];
return (
intval($now)>intval($timeout));
}

?>
mattcsl at gmail dot com
11年前
谢谢,

此函数在 `test1` 和 `test2` 之间缺少逗号,已在下方修复

function get_cache_id($name) {
// 保持缓存列表
$id=array( 'test1' => 1,
'test2' => 2
);

返回 $id[$name];
}
To Top