file驱动不支持cache.prefix配置,因其将key直接转为文件名(如user:123→user%3a123),无key命名空间机制;prefix仅对redis/memcached等驱动生效,file驱动完全忽略该字段。

缓存前缀在 file 驱动下完全无效,也不该配——file 驱动不支持前缀机制,强行设了也不会生效,反而可能误导后续排查。
为什么 file 驱动不能用 cache.prefix
file 驱动把每个缓存项序列化后写成独立文件,key 直接转为文件名(如 user:123 → user%3A123),根本没地方插前缀。config/cache.php 里 'prefix' 配置项只对 Redis、Memcached 等支持 key 命名空间的驱动起作用;file 驱动压根不读这个字段。
你改了 'prefix' => 'prod_',Cache::put('user:123', ...) 还是写进 storage/framework/cache/data/user%3A123,不会变成 prod_user%3A123。
想让 file 缓存“看起来有前缀”,只能靠目录隔离
file 驱动真正可控的隔离方式是换 path,不是 prefix:
- 在
config/cache.php的'file'store 里,把'path'改成带环境标识的路径,例如:storage_path('framework/cache/data/prod') - 确保该目录存在且可写:
mkdir -p storage/framework/cache/data/prod && chmod -R 755 storage/framework/cache/data/prod - 别依赖
php artisan cache:clear清理——它只会清默认 path;要清自定义目录得手动删或写脚本
切回 file 驱动时,CACHE_DRIVER=redis 还在生效怎么办
常见错误是只改了 .env 的 CACHE_DRIVER=file,但没清配置缓存:
- 执行
php artisan config:clear(必须) - 再运行
php artisan tinker -n,输入config('cache.default'),确认输出是"file" - 如果还是
"redis",检查config/cache.php顶部的'default' => env('CACHE_DRIVER', 'file')是否被硬编码改成了'redis' - file 驱动下
Cache::get()返回 null 不代表失败——它真就是没命中;别拿这个判断连接问题
file 驱动没有原子性、没有过期自动清理、高并发下会锁文件,这些限制比“没前缀”更值得警惕。前缀只是表象,目录隔离才是你在 file 下唯一能做的可控隔离动作。











