文件缓存仅适用于本地开发或单机低流量测试,因不支持并发安全过期清理、存在文件锁阻塞请求且无法跨进程共享;若配置了cache_driver=file却仍走redis,是因laravel优先读取bootstrap/cache/config.php缓存快照,须先执行php artisan config:clear再改.env并清缓存。

文件缓存只适合本地开发或单机低流量测试,配了也别在生产环境用——它不支持并发安全的过期清理,文件锁会卡住请求,且无法跨进程共享。
为什么 CACHE_DRIVER=file 还是走 Redis?
因为 Laravel 优先读取 bootstrap/cache/config.php 这个缓存过的配置快照。哪怕你改了 .env 里的 CACHE_DRIVER=file,只要没清掉配置缓存,Laravel 就继续用旧的默认值(比如 redis)。
- 必须执行
php artisan config:clear清掉配置缓存 - 再跑
php artisan cache:clear清掉当前缓存内容(否则旧键还在) - 如果之前跑过
config:cache,那改.env是无效的,得重跑一次
storage/framework/cache/data 目录不可写会怎样?
报错类似 failed to open stream: Permission denied,Cache::put() 直接失败返回 false,但不会抛异常,容易被忽略。
- 确认目录存在:
storage/framework/cache/data - 确保 Web 服务器用户(如 www-data、nginx 或 apache)有写权限
- Linux 下常用:
chmod -R 775 storage/framework/cache+chown -R www-data:www-data storage/framework/cache - Windows WSL 或 Docker 环境要注意挂载权限和 UID/GID 对齐
file 驱动下 Cache::forget() 不生效?
不是 bug,是 file 驱动的机制限制:它靠轮询扫描文件判断过期,forget() 只删文件,但若文件名含时间戳或哈希前缀(取决于 config/cache.php 的 prefix 和 path 设置),手动删错路径就找不到。
- 不要手删
storage/framework/cache/data/下的文件 —— 可能删错或漏删 - 统一用
php artisan cache:clear,它会遍历并清理整个目录 - 想删单个键?先确认键名是否被加了前缀(查
config/cache.php的'prefix'值),再按实际文件名匹配 -
Cache::has('key')在 file 驱动里可能返回false,即使文件存在但已过期 —— 它只检查文件是否存在,不校验有效期
file 驱动看着简单,但权限、路径、过期逻辑全得自己兜底。真要调试缓存行为,不如直接上 Redis 并用 redis-cli --scan 实时看键;file 只该出现在 APP_ENV=local 且没装 Redis 的临时场景里。











