【亲测免费】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,让你的应用飞起来吧! 🚀
提示:本文所有代码示例都经过实际测试,可以直接在项目中使用。如果在使用过程中遇到任何问题,欢迎在评论区留言讨论。
登录后查看全文
热门项目推荐
相关项目推荐
kernelopenEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。C0123
let_datasetLET数据集 基于全尺寸人形机器人 Kuavo 4 Pro 采集,涵盖多场景、多类型操作的真实世界多任务数据。面向机器人操作、移动与交互任务,支持真实环境下的可扩展机器人学习00
mindquantumMindQuantum is a general software library supporting the development of applications for quantum computation.Python059
PaddleOCR-VLPaddleOCR-VL 是一款顶尖且资源高效的文档解析专用模型。其核心组件为 PaddleOCR-VL-0.9B,这是一款精简却功能强大的视觉语言模型(VLM)。该模型融合了 NaViT 风格的动态分辨率视觉编码器与 ERNIE-4.5-0.3B 语言模型,可实现精准的元素识别。Python00
GLM-4.7-FlashGLM-4.7-Flash 是一款 30B-A3B MoE 模型。作为 30B 级别中的佼佼者,GLM-4.7-Flash 为追求性能与效率平衡的轻量化部署提供了全新选择。Jinja00
最新内容推荐
项目优选
收起
deepin linux kernel
C
27
11
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
491
3.62 K
Ascend Extension for PyTorch
Python
300
332
暂无简介
Dart
740
178
React Native鸿蒙化仓库
JavaScript
297
346
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
866
473
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
289
123
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
11
1
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
65
20
仓颉编程语言测试用例。
Cangjie
43
870