php如何实现缓存
PHP 实现缓存的常见方法
文件缓存
文件缓存是最简单的缓存方式,将数据存储在文件中。适合小型项目或临时缓存需求。
$cacheFile = 'cache/data.cache';
$cacheTime = 3600; // 缓存有效期(秒)
if (file_exists($cacheFile) && time() - filemtime($cacheFile) < $cacheTime) {
$data = file_get_contents($cacheFile);
} else {
$data = getDataFromDatabase(); // 模拟获取数据
file_put_contents($cacheFile, $data);
}
Memcached
Memcached 是高性能分布式内存缓存系统,适合高并发场景。
$memcached = new Memcached();
$memcached->addServer('localhost', 11211);
$key = 'cache_key';
$data = $memcached->get($key);
if (!$data) {
$data = getDataFromDatabase();
$memcached->set($key, $data, 3600); // 缓存1小时
}
Redis
Redis 是键值存储系统,支持更多数据结构,功能比 Memcached 更丰富。
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$key = 'user_data';
if (!$redis->exists($key)) {
$data = getDataFromDatabase();
$redis->set($key, serialize($data));
$redis->expire($key, 3600); // 设置过期时间
} else {
$data = unserialize($redis->get($key));
}
OPcache
OPcache 是 PHP 内置的字节码缓存,可显著提升 PHP 脚本执行速度。需在 php.ini 中启用:
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
数据库查询缓存
对于频繁查询的数据库结果,可以使用 MySQL 查询缓存(注意:MySQL 8.0 已移除该功能):
-- 在查询前启用
SET SESSION query_cache_type = ON;
-- 执行查询时会自动缓存
SELECT * FROM products WHERE category = 'electronics';
浏览器缓存控制
通过 HTTP 头控制浏览器缓存:
header("Cache-Control: max-age=3600, public"); // 缓存1小时
header("Expires: ".gmdate("D, d M Y H:i:s", time() + 3600)." GMT");
缓存策略选择建议
- 小型项目:文件缓存或APC/OPcache
- 高并发应用:Memcached 或 Redis
- 内容变化频繁:设置较短缓存时间
- 静态内容:设置较长缓存时间并配合版本控制
缓存清除机制
实现缓存自动清除或手动清除逻辑:
function clearCache($key) {
// 文件缓存
@unlink("cache/{$key}.cache");
// Redis缓存
$redis->del($key);
// Memcached缓存
$memcached->delete($key);
}
缓存键设计技巧
- 使用业务相关前缀:如 "user_profile_123"
- 包含版本信息:如 "v2_product_list"
- 对复杂参数生成哈希键:md5(serialize($params))
以上方法可根据项目需求单独或组合使用,以达到最佳性能优化效果。







