php缓存实现原理
PHP 缓存实现原理
PHP 缓存的核心目的是减少重复计算、数据库查询或文件读取,通过存储中间结果提升性能。常见的缓存类型包括 OPcache、文件缓存、内存缓存(如 Redis/Memcached)和数据库查询缓存。
OPcode 缓存
PHP 是解释型语言,每次执行脚本需先编译为 OPcode 再运行。OPcache 通过缓存编译后的 OPcode 避免重复编译:

- 启用方式:在
php.ini中配置opcache.enable=1。 - 原理:首次执行脚本时,OPcache 将 OPcode 存入共享内存,后续请求直接调用缓存的 OPcode。
- 优化点:适合生产环境,可减少 50% 以上的执行时间。
文件缓存
将动态内容生成静态文件存储,适用于内容更新频率低的场景:

$cache_file = 'cache/data.cache';
if (file_exists($cache_file) && time() - filemtime($cache_file) < 3600) {
echo file_get_contents($cache_file);
} else {
$content = generate_dynamic_content();
file_put_contents($cache_file, $content);
echo $content;
}
- 缺点:频繁读写可能造成 I/O 瓶颈。
内存缓存(Redis/Memcached)
通过内存存储键值数据,适合高并发场景:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$key = 'user_123';
if ($data = $redis->get($key)) {
echo $data;
} else {
$data = fetch_from_database();
$redis->setex($key, 3600, $data); // 缓存1小时
echo $data;
}
- 优势:读写速度极快(微秒级),支持分布式部署。
数据库查询缓存
MySQL 等数据库内置查询缓存,但需注意:
- 配置:通过
query_cache_type=1启用。 - 局限性:表数据变更时缓存自动失效,高并发写入场景可能降低性能。
缓存失效策略
- 时间过期(TTL):设置固定有效期,如 Redis 的
EXPIRE。 - 事件驱动:数据变更时主动清除缓存(如删除 Redis 键)。
- LRU(最近最少使用):Memcached 默认策略,淘汰最久未访问的数据。
实践建议
- 分层缓存:结合 OPcache(代码层)、Redis(数据层)、CDN(静态资源)。
- 避免雪崩:为缓存键设置随机过期时间(如 3000±600 秒)。
- 监控:通过
opcache_get_status()或 Redis 的INFO命令分析命中率。






