缓存驱动异常通常因配置未生效导致,需通过config('cache.default')和config('cache.stores.redis.connection')验证实际驱动与连接,执行php artisan config:clear && config:cache强制刷新,并确保.env中cache_driver=redis无空格、app_env=production已设置。

缓存驱动异常通常不是代码报错,而是命令执行后没效果、返回 null、清不掉缓存,或配置看似生效实则未切换。核心问题往往出在配置加载顺序、驱动注册逻辑和环境变量覆盖机制上,而不是缓存本身“坏了”。
确认当前实际生效的缓存驱动
别信 .env 或 config/cache.php 里写的值,要查运行时真实读取的结果:
- 进 tinker 执行:config('cache.default') —— 看输出是不是你期望的 redis、file 或其他驱动
- 再查具体 store:config('cache.stores.redis.connection') —— 确认 Redis 连接名是否指向专用 cache 连接(避免和 session 共用 DB 0)
- 如果输出仍是 file 或 array,说明 config:cache 没刷新,或 .env 中 CACHE_DRIVER 没被正确读取
修复 CACHE_DRIVER 不生效的典型路径
常见原因是 Laravel 优先使用 config/cache.php 中硬编码的 'default' 值,而非 .env 的 CACHE_DRIVER:
- 打开 config/cache.php,检查
'default' => env('CACHE_DRIVER', 'file')是否存在且未被注释 - 运行 php artisan config:clear && php artisan config:cache 强制重载
- 确保 .env 中 CACHE_DRIVER=redis 无空格、无引号,且 APP_ENV=production 已设置(否则部分命令拒绝执行)
- 连接 Redis 失败时,Laravel 默认静默返回 null,用 redis-cli -h $REDIS_HOST -p $REDIS_PORT ping 单独验证服务可达性
清理命令无效?先看清楚清的是谁
php artisan cache:clear 默认只清当前默认 store(如 redis),但很多问题其实出在别的地方:
- 想清路由缓存?用 php artisan route:clear,不是 cache:clear
- 修改了 Blade 文件却没更新?执行 php artisan view:clear
- 改了 config/ 下的文件没生效?必须 php artisan config:clear
- 用了 tags 缓存?得加参数:php artisan cache:clear --tags=users
- 清多驱动缓存?用 php artisan cache:clear --all-drivers 或指定 --drivers=redis,database
测试环境缓存干扰?直接切到 array 驱动
测试中不需要真实缓存,array 驱动最安全:
- 在 phpunit.xml 的
节点里加: - 或者在 tests/CreatesApplication.php 的 createApplication() 中动态设:$app['config']->set('cache.default', 'array')
- 避免用 file 驱动跑测试 —— 它有文件锁和并发写问题,array 才是真正的“无副作用”











