php 缓存实现
PHP 缓存实现方法
文件缓存
文件缓存是将数据存储在文件中,适用于小型项目或临时缓存需求。使用 file_put_contents 和 file_get_contents 函数可以轻松实现。
$cacheFile = 'cache/data.cache';
$cacheTime = 3600; // 缓存时间1小时
if (file_exists($cacheFile) && time() - filemtime($cacheFile) < $cacheTime) {
$data = file_get_contents($cacheFile);
} else {
$data = generateData(); // 生成数据的函数
file_put_contents($cacheFile, $data);
}
Memcached
Memcached 是一个高性能的分布式内存对象缓存系统,适合大规模数据缓存。PHP 通过 Memcached 扩展与之交互。
$memcached = new Memcached();
$memcached->addServer('localhost', 11211);
$key = 'cache_key';
$data = $memcached->get($key);
if (!$data) {
$data = generateData();
$memcached->set($key, $data, 3600); // 缓存1小时
}
Redis
Redis 是另一种高性能的键值存储系统,支持多种数据结构。PHP 通过 Redis 扩展与之交互。
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$key = 'cache_key';
$data = $redis->get($key);
if (!$data) {
$data = generateData();
$redis->set($key, $data, 3600); // 缓存1小时
}
APC/OPcache
APC (Alternative PHP Cache) 和 OPcache 是 PHP 内置的字节码缓存系统,可以显著提升 PHP 脚本的执行速度。OPcache 是 PHP 5.5 及以后版本的默认字节码缓存。

// APC 示例
if (apc_exists('cache_key')) {
$data = apc_fetch('cache_key');
} else {
$data = generateData();
apc_store('cache_key', $data, 3600);
}
// OPcache 主要用于字节码缓存,通常无需手动操作
数据库查询缓存
对于频繁访问的数据库查询结果,可以缓存查询结果以减少数据库负载。
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([1]);
$result = $stmt->fetchAll();
HTTP 缓存
通过设置 HTTP 头信息,可以利用浏览器缓存减少服务器负载。
header('Cache-Control: max-age=3600'); // 缓存1小时
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 3600) . ' GMT');
缓存清理策略
定期清理过期的缓存数据是保持系统高效运行的关键。可以通过定时任务或事件触发清理机制。

// 清理文件缓存示例
$files = glob('cache/*.cache');
foreach ($files as $file) {
if (time() - filemtime($file) > 3600) {
unlink($file);
}
}
缓存键设计
合理的缓存键设计可以避免冲突并提高缓存命中率。通常使用唯一标识符或哈希值作为键。
$key = md5('user_data_' . $userId);
缓存失效策略
缓存失效策略包括时间失效、事件失效和手动失效。根据业务需求选择合适的策略。
// 时间失效
$memcached->set('key', 'value', 3600);
// 事件失效
$redis->del('key');
// 手动失效
apc_delete('key');
分布式缓存
在分布式系统中,缓存一致性是一个重要问题。可以通过一致性哈希或分布式锁来解决。
// 使用 Redis 分布式锁
$lockKey = 'lock_key';
$lock = $redis->set($lockKey, 1, ['NX', 'EX' => 10]);
if ($lock) {
// 执行缓存操作
$redis->del($lockKey);
}






