php缓存实现
PHP 缓存实现方法
文件缓存
文件缓存是最简单的缓存方式,将数据存储在文件中,适合小型项目或临时缓存需求。
创建缓存文件:
$cacheFile = 'cache/data.cache';
$data = '缓存内容';
file_put_contents($cacheFile, $data);
读取缓存文件:
if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < 3600)) {
$data = file_get_contents($cacheFile);
} else {
// 重新生成数据
}
Memcached 缓存
Memcached 是高性能分布式内存对象缓存系统,适合高并发场景。
安装 Memcached 扩展后使用:
$memcached = new Memcached();
$memcached->addServer('localhost', 11211);
// 存储数据
$memcached->set('key', 'value', 3600);
// 获取数据
$value = $memcached->get('key');
if ($value === false) {
// 重新生成数据
}
Redis 缓存
Redis 是高性能键值存储系统,支持多种数据结构,功能比 Memcached 更丰富。
安装 Redis 扩展后使用:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 存储数据
$redis->set('key', 'value');
$redis->expire('key', 3600);
// 获取数据
$value = $redis->get('key');
if ($value === false) {
// 重新生成数据
}
OPcache
OPcache 是 PHP 内置的字节码缓存,能显著提升 PHP 执行速度。
在 php.ini 中启用:
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
数据库查询缓存
对频繁执行的数据库查询结果进行缓存,减少数据库压力。
使用 PDO 实现简单查询缓存:
$cacheKey = md5($sql);
if ($cache->has($cacheKey)) {
return $cache->get($cacheKey);
}
$stmt = $pdo->prepare($sql);
$stmt->execute();
$results = $stmt->fetchAll();
$cache->set($cacheKey, $results, 3600);
return $results;
页面级缓存
对整个页面输出进行缓存,适合内容不经常变化的页面。
实现页面缓存:
ob_start();
// 页面内容
$content = ob_get_contents();
file_put_contents('cache/page_'.md5($_SERVER['REQUEST_URI']).'.html', $content);
ob_end_flush();
HTTP 缓存头
利用浏览器缓存机制,通过设置 HTTP 头减少服务器负载。
设置缓存头:
header('Cache-Control: public, max-age=3600');
header('Expires: '.gmdate('D, d M Y H:i:s', time() + 3600).' GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($file)).' GMT');
框架缓存方案
现代 PHP 框架通常提供内置缓存组件,如 Laravel 的 Cache 门面:
// 存储
Cache::put('key', 'value', $minutes);
// 获取
$value = Cache::get('key');
// 记住结果,不存在时自动生成
$value = Cache::remember('key', $minutes, function () {
return DB::table(...)->get();
});
缓存失效策略
合理的缓存失效策略对系统性能至关重要。
基于时间失效:
$cache->set('key', 'value', 3600); // 1小时后失效
基于事件失效:
// 当数据更新时
$cache->delete('key');
条件失效:
if ($dataChanged) {
$cache->delete('key');
}
缓存命名空间
使用命名空间管理缓存键,避免冲突。
实现命名空间:
$namespace = 'user_'.$userId;
$cacheKey = $namespace.':profile';
多级缓存
结合多种缓存技术实现多级缓存体系。
内存缓存 + 文件缓存:

if ($memcached->get('key')) {
return $memcached->get('key');
} elseif (file_exists($fileCache)) {
$data = file_get_contents($fileCache);
$memcached->set('key', $data, 3600);
return $data;
}






