直接安装 symfony/cache 组件即可,无需全局安装 symfony;需区分 psr-6(cacheitempoolinterface)与 psr-16(simplecacheinterface)的使用场景及实例化方式,redisadapter 必须传入持久化连接,phpfilesadapter 需显式指定绝对路径缓存目录。

直接装 symfony/cache 就行,不用碰 Composer 全局安装
Composer 是包管理器,不是 Symfony 的安装工具。你不需要“安装 Symfony Cache”这个动作,只需要在项目里引入 symfony/cache 这个组件包。全局装 Composer 本身是前提,但那是另一回事——别被标题带偏。
常见错误现象:composer require symfony/framework-bundle 后发现没缓存类、CacheInterface 找不到,其实是只装了框架骨架,没装缓存组件本身。
- 执行
composer require symfony/cache即可(推荐 v6.4+ 或 v7.x,兼容 PHP 8.1+) - 如果项目已用 Symfony Flex,它会自动注册缓存服务;纯 PHP 项目则需手动实例化
- 不要装
symfony/symfony(全量包),臃肿且已废弃
PSR-6 和 PSR-16 实例不能混用,但可以共存
symfony/cache 同时实现两个标准,但接口职责不同:PSR-6 是「缓存池 + 缓存项」模型,PSR-16 是「简单键值对」模型。它们底层可共享同一存储(比如 Redis),但 API 完全隔离。
使用场景:写 SDK 或通用工具函数,优先用 Psr\SimpleCache\CacheInterface(PSR-16);做 Symfony 应用或需要细粒度控制(TTL、标签、延迟写入),选 Psr\Cache\CacheItemPoolInterface(PSR-6)。
- PSR-16 实例:用
new \Symfony\Component\Cache\Adapter\PhpFilesAdapter()不行,得用new \Symfony\Component\Cache\Simple\PhpFilesCache() - PSR-6 实例:同名 Adapter 类(如
RedisAdapter)返回的是 Pool,不是 SimpleCache - 别试图把 PSR-6 的
CacheItemPoolInterface强转成 PSR-16 接口——类型不兼容,运行时报错
RedisAdapter 默认不走持久连接,高并发下容易打满连接数
用 Redis 做后端时,RedisAdapter 默认每次操作都新建 Redis 连接,不是复用。线上环境若每秒请求上百,Redis 连接数可能瞬间飙到上千,触发 maxclients 拒绝。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
性能影响:本地开发看不出问题,一上生产就变慢甚至超时;错误信息类似 Connection refused 或 Redis server went away。
- 必须显式传入一个持久化的
Predis\Client或Redis实例(启用pconnect) - 示例:
new RedisAdapter(new \Predis\Client('tcp://127.0.0.1:6379'), 'my_cache', 0) - PHP 内置
Redis扩展更推荐:$redis = new \Redis(); $redis->pconnect('127.0.0.1', 6379); new RedisAdapter($redis) - 别依赖
RedisAdapter::createConnection()的默认行为——它不持久
文件缓存(PhpFilesAdapter)在 CLI 和 Web 环境下路径不一致
这个 Adapter 把缓存编译成 PHP 文件存在磁盘,但 CLI 脚本和 Web 请求的当前工作目录(getcwd())往往不同,导致缓存写到错地方、读不到、重复生成。
常见错误现象:Web 页面能命中缓存,命令行跑 php bin/console cache:clear 却提示“缓存未找到”,或者反过来;var/cache/dev/ 下出现多个 cache- 开头的临时目录。
- 必须显式指定缓存目录,比如
new PhpFilesAdapter('app', 0, '/tmp/myapp_cache') - 路径要绝对,别用相对路径或
__DIR__—— CLI 和 Web 的__DIR__可能指向不同位置 - 确保该目录 Web 用户和 CLI 用户都有读写权限(尤其 Linux 上 www-data vs 当前用户)
- 开发环境慎用文件缓存做“热重载”测试——OPcache 可能缓存旧文件,导致行为不一致
缓存最难的从来不是怎么写那一行 set(),而是确认你用的 Adapter 真正在用你认为的那个后端,以及那个后端的状态是否被其他进程悄悄改写了。










