spatie/laravel-responsecache 安装失败主因是 Laravel 版本不兼容:Laravel 8 及以下需用 ^6.0,9/10 可直接安装;缓存生效需正确注册中间件、配置 cache_profile 并检查 Redis 序列化与键前缀。

composer require spatie/laravel-responsecache 装不上?先确认 Laravel 版本兼容性
spatie/laravel-responsecache 从 v7 开始只支持 Laravel ^9.0 或 ^10.0,如果你用的是 Laravel 8 或更早版本,composer require spatie/laravel-responsecache 会报依赖冲突——不是命令写错,是包本身已放弃兼容。
解决方法很简单:
- 查当前 Laravel 版本:
php artisan --version - Laravel 8 → 改用
composer require spatie/laravel-responsecache:^6.0 - Laravel 9/10 → 直接
composer require spatie/laravel-responsecache(默认拉最新稳定版) - 别跳过
config/app.php中的 Service Provider 注册(Laravel 8 及以下需手动加;Laravel 9+ 自动发现,但得确保AppServiceProvider没禁用自动发现)
缓存没生效?检查中间件注册位置和响应类型
ResponseCache 只缓存「成功响应」(HTTP 状态码 200、201、204 等),且默认跳过带 Cookie、Authorization 头、或响应头含 Cache-Control: no-cache 的请求。最常见失效原因是中间件顺序不对。
必须把 ResponseCacheMiddleware 放在路由中间件栈靠前位置(比如在 EncryptCookies 之后、StartSession 之前),否则 Session 启动后响应就带了 Cookie,直接被跳过缓存。
- 在
app/Http/Kernel.php的$middlewareGroups['web']中,把它插到\App\Http\Middleware\EncryptCookies::class下一行 - 别把它放到
$routeMiddleware里再手动加到单个路由——那样只对指定路由生效,且容易漏掉全局逻辑 - 测试时用
curl -I http://your-app.test/some-route看响应头是否出现X-Response-Cache: hit或miss
缓存策略不按预期?重点看 cache_profile 配置项
默认缓存所有 GET 请求 10 分钟,但实际项目中往往需要区分:API 接口缓存 5 分钟,首页缓存 1 小时,用户仪表盘完全不缓存。这靠 cache_profile 类控制,不是改 config 文件就能搞定的。
默认配置指向 Spatie\ResponseCache\CacheProfiles\CacheAllSuccessfulGetRequests,它太宽泛。你应该自定义一个类继承 CacheProfile,重写 shouldCacheRequest 和 cacheRequestUntil 方法:
- 在
app/ResponseCache/MyCacheProfile.php里写逻辑,比如排除request()->is('dashboard/*') - 在
config/responsecache.php中把'cache_profile' => App\ResponseCache\MyCacheProfile::class - 注意:
shouldCacheRequest返回false时,连cacheRequestUntil都不会调用——别把排除逻辑写反 - 时间用
now()->addMinutes(60),别传整数分钟(v7+ 已弃用数字参数)
Redis 缓存键乱码或命中率低?检查序列化方式和键前缀
ResponseCache 默认用 Laravel 的 cache 驱动,但如果底层是 Redis,且你同时用了其他序列化方式(比如 igbinary 或 msgpack),可能导致缓存键无法被正确识别或反序列化失败,表现为 cache miss 频繁或日志里出现 unserialize(): Error at offset。
更隐蔽的问题是多应用共用 Redis 时键冲突——ResponseCache 默认键前缀是 responsecache:,没带环境标识。
- 在
config/responsecache.php中显式设置'cache_prefix' => 'myapp_'.app()->environment().'_responsecache:' - 确保
CACHE_DRIVER=redis且REDIS_CLIENT=predis(或phpredis)与你的扩展一致;Laravel 10 默认用phpredis,但某些 Docker 环境没装扩展,会静默退回到 file 驱动 - 清 Redis 时别只 flushdb,用
redis-cli --scan --pattern "myapp_*_responsecache:*" | xargs redis-cli del精准清理
缓存 HTTP 响应这事,真正难的不是装包,而是理解它在哪一层介入、怎么跟 Laravel 的中间件生命周期咬合、以及缓存键到底由谁生成——这些地方一模糊,问题就藏得深。


















