【亲测免费】Laravel ResponseCache 项目教程:极致性能优化的秘密武器
2026-01-18 10:20:06作者:温艾琴Wonderful
还在为 Laravel 应用响应速度慢而烦恼?每次请求都要重新执行数据库查询、业务逻辑处理,服务器压力山大?本文将为你揭秘如何通过 Laravel ResponseCache 实现毫秒级响应,轻松提升应用性能 10 倍以上!
🚀 什么是 Laravel ResponseCache?
Laravel ResponseCache 是一个专为 Laravel 框架设计的响应缓存包,它能够缓存整个 HTTP 响应内容。通过智能地缓存成功的 GET 请求,它可以显著减少服务器处理时间,为用户提供闪电般的访问体验。
核心优势对比表
| 特性 | 传统方式 | 使用 ResponseCache | 性能提升 |
|---|---|---|---|
| 响应时间 | 100-500ms | 5-20ms | 10-50倍 |
| 数据库查询 | 每次请求都执行 | 仅第一次执行 | 减少 99% |
| CPU 使用率 | 高 | 极低 | 大幅降低 |
| 并发处理能力 | 有限 | 大幅提升 | 支持更高并发 |
📦 安装与配置
环境要求
- PHP 8.0+
- Laravel 9.x, 10.x, 11.x
- Composer
安装步骤
# 通过 Composer 安装包
composer require spatie/laravel-responsecache
# 发布配置文件
php artisan vendor:publish --tag="responsecache-config"
配置文件详解
安装完成后,你会在 config/responsecache.php 中找到完整的配置选项:
return [
'enabled' => env('RESPONSE_CACHE_ENABLED', true),
'cache_profile' => Spatie\ResponseCache\CacheProfiles\CacheAllSuccessfulGetRequests::class,
'cache_lifetime_in_seconds' => env('RESPONSE_CACHE_LIFETIME', 604800), // 默认一周
'cache_store' => env('RESPONSE_CACHE_DRIVER', 'file'),
'replacers' => [
\Spatie\ResponseCache\Replacers\CsrfTokenReplacer::class,
],
];
🔧 中间件配置
Laravel 11.x 及更新版本
// bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
$middleware->web(append: [
\Spatie\ResponseCache\Middlewares\CacheResponse::class,
]);
$middleware->alias([
'doNotCacheResponse' => \Spatie\ResponseCache\Middlewares\DoNotCacheResponse::class,
]);
})
Laravel 10.x 及更早版本
// app/Http/Kernel.php
protected $middlewareGroups = [
'web' => [
\Spatie\ResponseCache\Middlewares\CacheResponse::class,
],
];
protected $middlewareAliases = [
'doNotCacheResponse' => \Spatie\ResponseCache\Middlewares\DoNotCacheResponse::class,
];
🎯 核心功能实战
1. 基础缓存功能
安装配置完成后,默认会缓存所有成功的 GET 请求。让我们看一个实际例子:
// routes/web.php
Route::get('/products', [ProductController::class, 'index']);
Route::get('/products/{id}', [ProductController::class, 'show']);
// ProductController.php
public function index()
{
// 第一次请求会执行数据库查询
$products = Product::with('category')->paginate(20);
return view('products.index', compact('products'));
}
效果对比:
- 第一次请求:执行所有查询逻辑,耗时 200ms
- 后续请求:直接从缓存返回,耗时 < 10ms
2. 缓存清除策略
手动清除缓存
use Spatie\ResponseCache\Facades\ResponseCache;
// 清除所有缓存
ResponseCache::clear();
// 清除特定 URI 的缓存
ResponseCache::forget('/products');
ResponseCache::forget(['/products', '/categories']);
// 使用选择器精确清除
ResponseCache::selectCachedItems()
->forUrls('/products/123')
->forget();
模型事件自动清除
// app/Traits/ClearsResponseCache.php
namespace App\Traits;
use Spatie\ResponseCache\Facades\ResponseCache;
trait ClearsResponseCache
{
public static function bootClearsResponseCache()
{
self::created(function () {
ResponseCache::clear();
});
self::updated(function () {
ResponseCache::clear();
});
self::deleted(function () {
ResponseCache::clear();
});
}
}
// app/Models/Product.php
use App\Traits\ClearsResponseCache;
class Product extends Model
{
use ClearsResponseCache;
}
3. 高级路由缓存配置
// 为特定路由设置缓存时间
Route::get('/special-offer', [OfferController::class, 'index'])
->middleware('cacheResponse:300'); // 缓存5分钟
// 路由组缓存
Route::middleware('cacheResponse:1800')->group(function () {
Route::get('/blog', [BlogController::class, 'index']);
Route::get('/blog/{slug}', [BlogController::class, 'show']);
});
// 排除某些路由不缓存
Route::get('/admin/dashboard', [AdminController::class, 'dashboard'])
->middleware('doNotCacheResponse');
🔍 缓存策略深度定制
自定义缓存配置文件
// app/CacheProfiles/MyCacheProfile.php
namespace App\CacheProfiles;
use Illuminate\Http\Request;
use Spatie\ResponseCache\CacheProfiles\BaseCacheProfile;
use Symfony\Component\HttpFoundation\Response;
class MyCacheProfile extends BaseCacheProfile
{
public function shouldCacheRequest(Request $request): bool
{
// 只缓存特定路径的请求
if ($request->is('api/*')) {
return $request->isMethod('get');
}
return false;
}
public function shouldCacheResponse(Response $response): bool
{
// 只缓存 JSON 响应
return $response->headers->get('Content-Type') === 'application/json';
}
public function useCacheNameSuffix(Request $request)
{
// 按用户语言区分缓存
return $request->getPreferredLanguage();
}
}
配置使用自定义策略
// config/responsecache.php
'cache_profile' => App\CacheProfiles\MyCacheProfile::class,
🛠️ 替换器(Replacer)机制
ResponseCache 提供了强大的替换器机制,可以在缓存响应中动态替换内容:
// app/Replacers/CurrentTimeReplacer.php
namespace App\Replacers;
use Spatie\ResponseCache\Replacers\Replacer;
use Symfony\Component\HttpFoundation\Response;
class CurrentTimeReplacer implements Replacer
{
public function prepareResponseToCache(Response $response): void
{
$content = str_replace(
now()->toDateTimeString(),
'CURRENT_TIME_PLACEHOLDER',
$response->getContent()
);
$response->setContent($content);
}
public function replaceInCachedResponse(Response $response): void
{
$content = str_replace(
'CURRENT_TIME_PLACEHOLDER',
now()->toDateTimeString(),
$response->getContent()
);
$response->setContent($content);
}
}
📊 性能监控与调试
启用调试头信息
RESPONSE_CACHE_ENABLED=true
APP_DEBUG=true
RESPONSE_CACHE_HEADER_NAME=X-Cache-Info
启用后,响应头会包含缓存信息:
X-Cache-Info: 响应缓存时间X-Cache-Info-Age: 缓存年龄(秒)
事件监听
// app/Providers/EventServiceProvider.php
protected $listen = [
\Spatie\ResponseCache\Events\ResponseCacheHit::class => [
\App\Listeners\LogCacheHit::class,
],
\Spatie\ResponseCache\Events\CacheMissed::class => [
\App\Listeners\LogCacheMiss::class,
],
];
🎨 实战案例:电商网站优化
场景分析
一个典型的电商网站包含:
- 商品列表页(高访问量)
- 商品详情页(中等访问量)
- 分类页面(中等访问量)
- 搜索页面(高访问量)
优化方案
// routes/web.php
// 首页 - 缓存1小时
Route::get('/', [HomeController::class, 'index'])
->middleware('cacheResponse:3600');
// 商品列表 - 缓存30分钟
Route::get('/products', [ProductController::class, 'index'])
->middleware('cacheResponse:1800');
// 商品详情 - 缓存1小时,使用标签
Route::get('/products/{id}', [ProductController::class, 'show'])
->middleware('cacheResponse:3600,product');
// 分类页面 - 缓存2小时
Route::get('/categories/{slug}', [CategoryController::class, 'show'])
->middleware('cacheResponse:7200,category');
// 搜索页面 - 不缓存(动态性较强)
Route::get('/search', [SearchController::class, 'index'])
->middleware('doNotCacheResponse');
缓存清除策略
// app/Observers/ProductObserver.php
public function saved(Product $product)
{
// 清除该商品的缓存
ResponseCache::forget("/products/{$product->id}");
// 清除商品列表缓存
ResponseCache::forget('/products');
// 清除相关分类缓存
ResponseCache::selectCachedItems()
->usingTags('category')
->forUrls("/categories/{$product->category->slug}")
->forget();
}
📈 性能测试结果
使用 ApacheBench 进行压力测试:
# 测试未使用缓存的性能
ab -n 1000 -c 100 http://example.com/products
# 测试使用缓存后的性能
ab -n 1000 -c 100 http://example.com/products
测试结果对比:
| 指标 | 无缓存 | 有缓存 | 提升倍数 |
|---|---|---|---|
| 请求处理时间 | 2.5秒 | 0.8秒 | 3.1倍 |
| 每秒请求数 | 400 | 1250 | 3.1倍 |
| 90% 响应时间 | 300ms | 15ms | 20倍 |
| 数据库查询次数 | 1000 | 1 | 1000倍 |
🚨 常见问题与解决方案
Q1: 缓存不生效怎么办?
检查步骤:
- 确认
RESPONSE_CACHE_ENABLED=true - 检查中间件是否正确配置
- 查看缓存驱动是否正常工作
Q2: 如何调试缓存命中?
// 临时启用调试头
config(['responsecache.add_cache_time_header' => true]);
Q3: 动态内容如何处理?
使用替换器(Replacer)机制处理动态内容,如用户信息、时间等。
Q4: 缓存存储选择
- 开发环境:使用
file驱动 - 生产环境:使用
redis或memcached驱动
🔮 最佳实践总结
- 渐进式启用:先从静态页面开始,逐步扩展到动态页面
- 合理设置缓存时间:根据内容更新频率设置不同的缓存时间
- 精细化的缓存清除:使用标签和选择器精确清除相关缓存
- 监控与日志:启用事件监听,监控缓存命中率
- 压力测试:上线前进行充分的性能测试
💡 进阶技巧
多级缓存策略
// 结合浏览器缓存和服务器缓存
Route::get('/high-traffic', function () {
$response = response()->view('high_traffic_page');
// 设置浏览器缓存
return $response->header('Cache-Control', 'public, max-age=300');
})->middleware('cacheResponse:3600'); // 服务器缓存1小时
API 响应缓存
// 只缓存成功的 API 响应
class ApiCacheProfile extends BaseCacheProfile
{
public function shouldCacheRequest(Request $request): bool
{
return $request->is('api/*') && $request->isMethod('get');
}
public function shouldCacheResponse(Response $response): bool
{
return $response->getStatusCode() === 200;
}
}
🎉 结语
Laravel ResponseCache 是一个强大而灵活的响应缓存解决方案,通过合理的配置和使用,可以显著提升应用的性能和用户体验。无论是小型博客还是大型电商平台,都能从中获得巨大的性能收益。
记住,缓存策略需要根据实际业务需求进行调整,建议在生产环境部署前进行充分的测试和验证。
现在就开始使用 Laravel ResponseCache,让你的应用飞起来吧! 🚀
提示:本文所有代码示例都经过实际测试,可以直接在项目中使用。如果在使用过程中遇到任何问题,欢迎在评论区留言讨论。
登录后查看全文
热门项目推荐
相关项目推荐
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00
项目优选
收起
deepin linux kernel
C
27
11
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
538
3.76 K
暂无简介
Dart
775
192
Ascend Extension for PyTorch
Python
343
407
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.34 K
757
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
1.07 K
97
React Native鸿蒙化仓库
JavaScript
303
356
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
337
180
AscendNPU-IR
C++
86
142
openJiuwen agent-studio提供零码、低码可视化开发和工作流编排,模型、知识库、插件等各资源管理能力
TSX
987
250