PHP无框架下实现微信Access Token文件缓存方案
本文介绍在原生PHP环境中,不依赖任何框架如何实现简单的数据缓存功能。重点讲解如何编写一个基于文件的Cache类,用于长效保存微信开发中常用的Access Token等带有过期时间的关键数据。
场景与目标
在进行微信开发时,经常需要使用微信基础接口的 access_token 或网页授权 access_token。这些数据通常具有有效期,且频繁请求会触发接口频率限制。
当项目未使用Laravel、ThinkPHP等主流框架(这些框架自带强大的缓存驱动)时,开发者需要手动处理缓存逻辑。本文将提供一个原生的PHP实现思路,通过本地文件作为存储介质,解决这一痛点。
准备工作
- 运行环境:标准的PHP运行环境(7.x或以上版本),支持基本的文件系统操作。
- 核心逻辑:使用
JSON格式将键值对存储在单一文件中,通过记录添加时间和过期时长来控制缓存生命周期。 - 风险提醒:此方案为单进程/同步文件读写模型。在高并发场景下可能存在性能瓶颈或文件锁竞争问题,建议仅适用于中小型应用或对缓存要求不极致的场景。生产环境请考虑Redis或Memcached。
真实操作顺序
第1步:定义缓存配置与初始化
首先定义 Cache 类,明确缓存文件的存放路径和文件名。默认情况下,我们将其放在指定的目录下。
// 自定义缓存类
class Cache {
public $cacheFile = "cache.json"; // 存储数据的文件名
public $dir = "./cach2/"; // 缓存目录路径,可根据实际需求修改
// 确保缓存文件存在并返回其绝对路径
private function hasFile() {
// 如果目录不存在,则创建
if (!file_exists($this->dir)) {
mkdir($this->dir);
}
// 如果文件不存在,则创建空文件
if (!file_exists($this->dir . $this->cacheFile)) {
touch($this->dir . $this->cacheFile);
}
return $this->dir . $this->cacheFile;
}
}
第2步:实现写入缓存功能 (setCache)
该方法的目的是将数据存入文件。它接收键名、值和有效期。如果值为空,则执行删除操作;否则更新或新增键值对,并记录当前时间戳。
// 设置缓存
public function setCache($name, $val, $expires_time) {
$file = $this->hasFile();
// 读取现有JSON内容并转为数组
$str = file_get_contents($file);
$arr = json_decode($str, true);
// 如果值为空,视为删除请求
if (empty($val)) {
unset($arr[$name]);
} else {
// 存入值、过期时间、添加时间
$arr[$name] = array(
"value" => $val,
"expires_time" => $expires_time,
"add_time" => time()
);
}
// 将数组转回JSON字符串并写回文件
$newStr = json_encode($arr);
file_put_contents($file, $newStr);
}
第3步:实现读取缓存功能 (getCache)
读取时需要验证数据是否存在以及是否已过期。如果过期,自动调用删除方法以清理垃圾数据。
// 获取缓存
public function getCache($name) {
$file = $this->hasFile();
// 读取文件内容
$allStr = file_get_contents($file);
$allArr = json_decode($allStr, true);
// 检查键是否存在
if (!isset($allArr[$name])) {
return false;
}
$arr = $allArr[$name];
// 判断是否过期:当前时间 > 添加时间 + 有效时长
if ($arr["add_time"] + $arr["expires_time"] < time()) {
$this->removeCache($name); // 过期自动移除
return false;
}
return $arr["value"];
}
第4步:实现删除缓存功能 (removeCache)
删除逻辑复用了 setCache,传入空值即可触发删除分支。
// 移除指定Key的缓存
public function removeCache($name) {
$this->setCache($name, '', 0);
}
}
代码完整示例与测试
将上述部分组合成一个完整的可运行脚本。以下测试展示了如何实例化对象、设置路径并进行读写操作。
$cache = new Cache();
$cache->dir = "../cc/"; // 指定缓存目录
// 1. 测试获取不存在的Key
echo $cache->getCache("zhang") ?: "(Null Result)
";
// 2. 设置缓存:key='liu', value='liuqi', 有效期100秒
$cache->setCache("liu", "liuqi", 100);
// 3. 获取刚设置的缓存
$result = $cache->getCache("liu");
echo "获取结果: " . $result . "
";
// 4. 模拟过期后再次获取(此处需等待或使用短时效进行测试逻辑,代码演示中直接展示结构)
// $cache->removeCache("liu"); // 如需立即清除可取消注释
完成判断
成功的关键在于以下几点:
- 文件路径正确:确保PHP有权限在指定的
$cache->dir路径下创建文件和目录。 - JSON编码正常:如果缓存值包含特殊字符,建议将
json_encode改为json_encode($arr, JSON_UNESCAPED_UNICODE)以避免中文乱码。 - 逻辑闭环:
getCache中包含了过期判断,确保不再提供失效数据。
简要总结
以上就是PHP原生环境下使用文件存储进行简单数据缓存的详细内容。该方案虽然简陋,但足以应对小型项目中微信Token等数据的临时保管需求。更多关于PHP微信开发的资料,欢迎持续关注后续更新!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









