php仿typecho文件缓存类
11小时前
Typecho 的缓存机制主要通过 Typecho_Cache 类实现,它不仅支持文件缓存,还支持内存缓存等多种方式。
下面是一个核心的文件缓存实现,包含了缓存的设置、获取、删除和清空功能:
<?php
/**
* Typecho 风格的文件缓存类
*/
class Typecho_Cache
{
/**
* 缓存目录
* @var string
*/
private static $_cacheDir;
/**
* 初始化缓存目录
*
* @param string $cacheDir 缓存目录路径
* @return void
*/
public static function init($cacheDir = null)
{
if ($cacheDir === null) {
// 默认缓存目录为根目录下的 cache 文件夹
self::$_cacheDir = dirname(__FILE__) . '/cache';
} else {
self::$_cacheDir = $cacheDir;
}
// 如果缓存目录不存在,则创建
if (!is_dir(self::$_cacheDir)) {
mkdir(self::$_cacheDir, 0755, true);
}
}
/**
* 设置缓存
*
* @param string $key 缓存键名
* @param mixed $value 要缓存的数据
* @param integer $expire 过期时间(秒),0 表示永不过期
* @return boolean
*/
public static function set($key, $value, $expire = 0)
{
$cacheFile = self::getCacheFile($key);
// 序列化数据,并添加过期时间信息
$data = array(
'data' => $value,
'expire' => $expire > 0 ? time() + $expire : 0
);
return file_put_contents($cacheFile, serialize($data)) !== false;
}
/**
* 获取缓存
*
* @param string $key 缓存键名
* @return mixed 缓存数据或 false
*/
public static function get($key)
{
$cacheFile = self::getCacheFile($key);
// 检查缓存文件是否存在
if (!file_exists($cacheFile)) {
return false;
}
// 读取并反序列化数据
$data = unserialize(file_get_contents($cacheFile));
// 检查缓存是否过期
if ($data['expire'] != 0 && $data['expire'] < time()) {
// 缓存过期,删除文件
self::delete($key);
return false;
}
return $data['data'];
}
/**
* 删除指定缓存
*
* @param string $key 缓存键名
* @return boolean
*/
public static function delete($key)
{
$cacheFile = self::getCacheFile($key);
if (file_exists($cacheFile)) {
return unlink($cacheFile);
}
return false;
}
/**
* 清空所有缓存
*
* @return boolean
*/
public static function flush()
{
$handle = opendir(self::$_cacheDir);
if ($handle === false) {
return false;
}
while (($file = readdir($handle)) !== false) {
if ($file != '.' && $file != '..') {
$filePath = self::$_cacheDir . '/' . $file;
if (is_file($filePath)) {
unlink($filePath);
}
}
}
closedir($handle);
return true;
}
/**
* 根据键名生成缓存文件路径
*
* @param string $key 缓存键名
* @return string 缓存文件路径
*/
private static function getCacheFile($key)
{
// 使用 md5 哈希确保文件名安全且唯一
return self::$_cacheDir . '/' . md5($key) . '.cache';
}
}
使用示例
<?php
// 初始化缓存,指定缓存目录
Typecho_Cache::init('/path/to/your/cache/directory');
// 设置缓存,缓存 'my_data' 1小时(3600秒)
$data = array('name' => 'Typecho', 'version' => '1.2');
Typecho_Cache::set('my_data', $data, 3600);
// 获取缓存
$cachedData = Typecho_Cache::get('my_data');
if ($cachedData !== false) {
echo "从缓存中获取数据: ";
print_r($cachedData);
}
// 删除缓存
Typecho_Cache::delete('my_data');
// 清空所有缓存
Typecho_Cache::flush();1. 文件命名:使用 md5($key) 对缓存键名进行哈希处理,生成唯一且安全的文件名。
2. 数据存储:将数据和过期时间一起序列化后存入文件。
3. 过期检查:读取缓存时,先检查当前时间是否超过过期时间。
如果过期,则删除缓存文件并返回 false 。
4. 目录管理:提供了灵活的缓存目录设置和初始化方法。