主流PHP框架普遍支持file、redis、memcached、apcu、database五种缓存驱动;Redis因功能全、性能高、支持标签与集群,成为生产首选;APCu适合作为本地一级缓存配合Redis二级共享缓存使用。
主流PHP框架(Laravel、ThinkPHP、Symfony)都原生支持多种缓存后端,但**不是所有驱动在所有环境下都可用或推荐**——关键看部署规模、数据一致性要求和运维能力。
现代PHP框架通过统一的 Cache 接口抽象底层存储,常见驱动包括:
file:所有环境默认可用,无需扩展,但并发读写易出错,仅适合开发或单机小流量redis:Laravel/ThinkPHP/Symfony 全系支持,需安装 php-redis 扩展和 Redis 服务;支持原子操作、过期、标签(Laravel)、管道,是生产首选memcached:支持分布式,但不支持复杂数据结构和持久化;ThinkPHP 和 Laravel 支持,Symfony 需额外包;注意 PHP 的 memcached 扩展(非 memcache)才支持 SASL 认证apcu:仅限单机,无网络开销,适合本地缓存热点数据(如配置、路由),但不能跨进程共享(PHP-FPM 多 worker 下需配合 apcu-bc)database:Laravel 支持,把缓存写进数据库表;调试方便,但性能差,绝不用于高并发场景不是因为“它最火”,而是它在功能、稳定性和生态上做到了关键平衡:
setex、hgetall、zrange 等丰富命令,能应对计数器、排行榜、会话、锁等复合需求Cache::tags()、ThinkPHP 的 Tag 功能依赖 Redis 的哈希结构模拟,Memcached 不支持标签失效直接上 redis 并不总是最优解——本地高频小数据查 Redis 反而增加网络往返。推荐「多级缓存」策略:
立即学习“PHP免费学习笔记(深入)”;
apcu 缓存极热数据(如站点配置、菜单树),TTL 设为 60–300 秒,避免每次请求都打 Redisredis 做共享缓存,存用户资料、商品库存等需跨节点一致的数据apcu 驱动做 config 和 route 缓存,redis 驱动做业务数据缓存apcu 不支持过期自动清理旧键,长期运行可能内存泄漏,建议定期调用 apcu_clear_cache() 或启用 apcu.gc_ttl
很多项目上线后才发现缓存没生效、数据不一致或突然变慢,往往栽在这三点:
user:123 在多个环境互相覆盖——务必在 prefix 配置里加上环境标识,如 prod_user:123
/user/999999999),导致每次回源查 DB;应在缓存未命中时,对空结果也写入一个短 TTL(如 60 秒)的 null 占位符Ca
che::forget('user:123'),下次读到的就是脏数据;建议在 Eloquent Model 的 saving/updating 事件中统一处理缓存不是加了就完事,真正难的是让缓存「该命中的时候命中,该失效的时候失效」——尤其在分布式环境下,键设计、失效时机、空值保护这些细节,比选哪个引擎重要得多。