Doctrine Cache 已废弃,应迁移到 PSR-6/PSR-16 标准实现,推荐使用 symfony/cache(支持 DoctrineAdapter 兼容旧代码)、php-cache 生态或轻量级适配器,并按环境注入不同后端以实现真正可插拔的缓存切换。

Doctrine Cache 不再维护,改用 php-cache 生态或 PSR-6 实现
Doctrine Cache 库早在 2019 年就已标记为 abandoned,官方明确不再维护。你现在通过 composer require doctrine/cache 安装的其实是社区 fork 版本(如 doctrine/doctrine-cache-bundle),但其接口不稳定、文档缺失、与现代 PHP 版本(尤其是 PHP 8.1+)兼容性差。真实项目中强行沿用会导致:Class 'Doctrine\Common\Cache\CacheProvider' 找不到、MultiDeleteCache 接口不可用、autoload 冲突等错误。
正确路径是迁移到 PSR-6 或 PSR-16 标准实现:
- 优先选用
php-cache/adapter-common+ 具体适配器(如php-cache/filesystem-adapter、php-cache/redis-adapter) - 或直接使用轻量级 PSR-6 实现,如
cache/array-adapter(开发)、cache/redis-adapter(生产)、cache/void-adapter(测试) - 若必须兼容旧代码,可用
symfony/cache—— 它完全实现 PSR-6,且提供DoctrineAdapter封装层,能桥接老式 Doctrine Cache 调用逻辑
用 symfony/cache 实现存储后端热切换
symfony/cache 是目前最稳妥的“多后端统一入口”方案:它不绑定具体驱动,靠构造时传入不同 Psr\SimpleCache\CacheInterface 或 Psr\Cache\CacheItemPoolInterface 实例即可切换底层,且自动处理序列化、TTL、前缀隔离等细节。
实操步骤:
- 安装:
composer require symfony/cache - 文件系统缓存:
new \Symfony\Component\Cache\Adapter\FilesystemAdapter('my_cache', 0, './var/cache') - Redis 缓存:
new \Symfony\Component\Cache\Adapter\RedisAdapter(new \Redis(), 'my_cache', 0)(需确保ext-redis已启用) - 内存缓存(仅开发):
new \Symfony\Component\Cache\Adapter\ArrayAdapter() - 切换只需改实例化语句,业务代码完全不用动 —— 所有
get()、set()、delete()调用保持一致
避免 cache/void-adapter 被误用于生产环境
cache/void-adapter 确实能“无缝替换”任意 PSR-6 缓存,但它返回永远为 null,且不抛异常、不记录日志。开发测试时很省心,但一旦配置泄漏到生产,会导致:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 所有缓存读写静默失败,业务逻辑退化为全量查库
- 监控指标(如 cache hit rate)归零却无告警
- 因缺少 TTL 控制,
save()调用看似成功,实际数据从未落盘
建议做法:
- 在 DI 容器中按环境注入不同适配器(如 Symfony 的
cache.app服务) - 绝不硬编码
new VoidAdapter();而是通过环境变量控制工厂类返回实例 - 上线前加一道检查:
if ($cache instanceof \Cache\Adapter\VoidAdapter) { throw new \RuntimeException('Void adapter detected in prod'); }
文件缓存路径权限和并发写入风险
用 FilesystemAdapter 时,./var/cache 目录若没设对权限或挂载为只读,会报 Failed to write cache file;更隐蔽的问题是高并发下多个进程同时写同一缓存项,可能触发 file_put_contents(): Only part of the file was written。
关键规避点:
- 确保目录属主与 Web 服务器进程一致(如 www-data),权限设为
0755,而非0777 - 禁用
chmod自动修正:new FilesystemAdapter(..., $defaultLifetime, $directory, false)第四个参数传false - 生产环境别用文件缓存做主存储——它本质是单机、非原子、无锁机制;Redis 或 Memcached 才是真多后端切换的基础
真正灵活的后端切换,不在于换几行代码,而在于把缓存抽象成可插拔契约,并让部署环境决定具体实现。否则所谓“切换”,不过是手动改配置再重启服务,和硬编码没区别。

















