symfony开发环境默认用内存缓存,要启用文件缓存需在cache.yaml中配置app为filesystem适配器、安装symfony/filesystem包、确保var/cache可写,并严格遵循psr-6流程操作。

Symfony 文件缓存适合开发调试,但默认在 dev 环境下不实际写入文件——它用的是 ArrayAdapter(内存缓存),所以你改了配置却看不到 var/cache/dev/ 下生成缓存文件,是正常现象。要让它真正落地为文件,得显式启用并配对依赖。
必须启用 filesystem 缓存适配器
默认的 cache.app 服务在 dev 环境下指向 cache.adapter.array,即使你在 cache.yaml 里写了 cache.adapter.filesystem,也常被容器别名覆盖。正确做法是:
- 在
config/packages/cache.yaml中明确指定:
cache:
app: cache.adapter.filesystem
default_psr6_provider: 'cache.provider.filesystem'
- 确保已安装
symfony/filesystem包:composer require symfony/filesystem - 确认
var/cache目录可写(临时排错可用chmod -R 777 var/cache,上线请改用更安全权限)
键名和过期时间要注意
文件缓存对键名敏感:含 . 或 / 的键(如 user.profile)可能触发 PSR-6 兼容问题,建议统一替换为下划线:user_profile。
设置过期时间优先用 expiresAfter(3600)(单位是秒),避免用 expiresAt(new \DateTime('+1 hour')) 引发时区或毫秒级偏差导致“刚设就过期”。
-
$item->expiresAfter(3600)→ 清晰、安全、推荐 -
$item->expiresAt(new \DateTimeImmutable('+1 hour'))→ 若必须用绝对时间,务必加Immutable
写入流程不能跳步
文件缓存不是键值直写,必须走标准 PSR-6 流程:
- 先调
$cache->getItem('key')拿到CacheItem对象 - 再调
$item->set($value)写入内容 - 最后调
$cache->save($item)才真正写入文件
错写成 $cache->set('key', 'value') 会报 Call to undefined method —— 因为 CacheInterface 根本没这个方法。
验证是否生效
光看 save() 不报错不代表成功。测试时建议:
- 调用
$cache->getItem('key')->isHit()确认命中 - 手动检查
var/cache/dev/pools/下是否有对应文件(路径含哈希,但文件存在即表示落地成功) - 用
var_dump($item->getExpiresAt())看实际过期时间,别只信代码写的字符串
不复杂但容易忽略。











