当前位置: 首页 > news >正文

Laravel ResponseCache 源码解析:从请求到响应的完整缓存流程

Laravel ResponseCache 源码解析:从请求到响应的完整缓存流程

【免费下载链接】laravel-responsecacheSpeed up a Laravel app by caching the entire response项目地址: https://gitcode.com/gh_mirrors/la/laravel-responsecache

Laravel ResponseCache 是一个强大的 Laravel 扩展包,它通过缓存整个响应来显著提升 Laravel 应用的性能。本文将深入解析其内部工作原理,带你了解从请求到响应的完整缓存流程。

1. 请求拦截:CacheResponse 中间件的作用

整个缓存流程的入口是src/Middlewares/CacheResponse.php中间件。当请求进入应用时,该中间件会首先检查是否启用了缓存以及是否应该绕过缓存。

// src/Middlewares/CacheResponse.php if ($this->responseCache->enabled($request) && ! $this->responseCache->shouldBypass($request)) { // 尝试获取缓存响应 }

中间件会先检查请求是否已经被缓存,如果有缓存则直接返回缓存的响应,从而跳过后续的业务逻辑处理,极大提升响应速度。

2. 缓存决策:CacheProfile 的关键作用

缓存系统如何决定哪些请求应该被缓存?这是由CacheProfile接口及其实现类负责的。默认实现是CacheAllSuccessfulGetRequests

// src/CacheProfiles/CacheAllSuccessfulGetRequests.php public function shouldCacheRequest(Request $request): bool { if ($request->ajax()) { return false; } if ($this->isRunningInConsole()) { return false; } return $request->isMethod('get'); }

这个方法决定了只有非 AJAX、非控制台且使用 GET 方法的请求才会被考虑缓存。

3. 响应判断:哪些响应可以被缓存

除了请求需要满足条件外,响应也需要通过缓存判断。shouldCacheResponse方法检查响应状态码和内容类型:

// src/CacheProfiles/CacheAllSuccessfulGetRequests.php public function shouldCacheResponse(Response $response): bool { if (! $this->hasCacheableResponseCode($response)) { return false; } if (! $this->hasCacheableContentType($response)) { return false; } return true; }

默认配置下,只有成功状态码(2xx)和重定向状态码(3xx),且内容类型为文本或 JSON 的响应才会被缓存。

4. 缓存存储:响应的序列化与存储

当确定要缓存响应时,系统会对响应进行一些处理后再存储:

// src/Middlewares/CacheResponse.php protected function makeReplacementsAndCacheResponse( Request $request, Response $response, ?int $lifetimeInSeconds = null, array $tags = [] ): void { $cachedResponse = clone $response; $this->getReplacers()->each(fn (Replacer $replacer) => $replacer->prepareResponseToCache($cachedResponse)); $this->responseCache->cacheResponse($request, $cachedResponse, $lifetimeInSeconds, $tags); }

这里会先克隆响应对象,然后应用各种替换器(Replacer)处理响应内容,最后调用cacheResponse方法将响应存储起来。

5. 缓存替换器:动态内容的处理

替换器(Replacer)是处理响应中动态内容的关键组件。例如,CsrfTokenReplacer可以处理 CSRF 令牌这类需要动态生成的内容。

替换器配置在config/responsecache.php文件中,系统会自动加载并应用这些替换器:

// src/Middlewares/CacheResponse.php protected function getReplacers(): Collection { return collect(config('responsecache.replacers')) ->map(fn (string $replacerClass) => app($replacerClass)); }

6. 缓存命中:从缓存中读取响应

当后续相同请求进来时,系统会直接从缓存中读取响应:

// src/Middlewares/CacheResponse.php protected function getCachedResponse(Request $request, array $tags = []): false|Response { try { $response = $this->responseCache->getCachedResponseFor($request, $tags); } catch (CouldNotUnserialize $exception) { throw $exception; } catch (Throwable $exception) { report("Unable to retrieve cached response when one was expected. Error: {$exception->getMessage()}"); return false; } event(new ResponseCacheHit($request)); $response = $this->addCacheAgeHeader($response); $this->getReplacers()->each(function (Replacer $replacer) use ($response) { $replacer->replaceInCachedResponse($response); }); return $response; }

读取缓存后,系统还会再次应用替换器,确保动态内容被正确替换,然后返回缓存的响应。

7. 缓存管理:缓存的清除与失效

Laravel ResponseCache 提供了清除缓存的命令:ClearCommand,位于src/Commands/ClearCommand.php。你可以通过 Artisan 命令手动清除缓存,也可以在配置文件中设置缓存的过期时间。

总结

Laravel ResponseCache 通过优雅的中间件设计和灵活的缓存策略,为 Laravel 应用提供了简单而强大的响应缓存解决方案。它的工作流程可以概括为:

  1. 请求进入,CacheResponse 中间件拦截
  2. 判断是否启用缓存及请求是否可缓存
  3. 如果缓存命中,则返回缓存响应
  4. 如果缓存未命中,继续处理请求
  5. 判断响应是否可缓存
  6. 处理响应并存储到缓存
  7. 返回响应

通过这个流程,Laravel ResponseCache 能够显著减少服务器处理时间,提高应用响应速度,为用户提供更好的体验。

【免费下载链接】laravel-responsecacheSpeed up a Laravel app by caching the entire response项目地址: https://gitcode.com/gh_mirrors/la/laravel-responsecache

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.cnnetsun.cn/news/1727750.html

相关文章:

  • 【 RAG 检索增强】技术解析:向量数据库、Embedding、召回与幻觉抑制
  • 新手福音:将csdn的python爬虫教程转化为快马平台可运行实战项目
  • GLM-4-9B-Chat-1M多语言翻译效果展示:中→日/韩/德实时响应对比实录
  • dij算法
  • IM022-【对文件夹操作pdf放在文件夹外】当前目录下合并文件夹中的图片为PDF并以文件夹名字命名PDF文件名
  • OpenClaw异常处理指南:千问3.5-35B-A3B-FP8任务失败的8种排查方法
  • claw-code 源码详细分析:Remote / SSH / Teleport / Deep Link——运行时分支爆炸怎样用「模拟模式」先收束状态机?
  • 深入理解 C# 架构思维:继承的界限、多态的解耦与属性的封装
  • 项目介绍 MATLAB实现基于经验启发式搜索(EHS)进行无人机三维路径规划的详细项目实例(含模型描述及部分示例代码) 专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢
  • 跷跷板效应:在亚马逊,为何一个品牌无法同时称霸两个心智山头
  • ---------------------- 1. 初始化配送数据!这里只需要改这里就完事 -...
  • Anthropic 炸场新品 Claude Code 源码遭扒?深度解析 18 个核心组件架构!
  • 无片外电容LDO电路设计 完整IP现成电路,具有过温保护和过流保护,带隙,BUFFER都有 性...
  • OpenClaw+Phi-3-mini-128k-instruct:技术博客自动生成与Hexo部署
  • 三步掌握高效提取全平台支持的音乐平台歌词提取工具使用指南
  • Laravel1.x:初代PHP框架的起点
  • 基于yolov26+pyqt5的无人机视角河道水面垃圾检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
  • Agent落地方法论入门到精通(非常详细),帮你避坑收藏这篇就够了!
  • GLM-4.1V-9B-Base赋能SpringBoot后端:构建智能内容审核微服务
  • 微信聊天记录导出恢复/备份/离线查看工具(支持最新版4.1及以上)
  • 低代码技术如何重构钣金工厂的数字化生产链路
  • 告别ifconfig手忙脚乱:MobaXterm一键SSH连接VMware Ubuntu的保姆级图解
  • 如何用tts-vue快速搭建本地语音合成系统:终极免费教程
  • 告别模型臃肿:手把手教你用vLLM部署NVFP4量化的DeepSeek模型(附完整配置)
  • 双卡 A100 + Ollama 生产部署从安装、踩坑、调优到最终可上线方案
  • 智慧车站三维空间智能管控系统白皮书——构建“全域感知 × 连续认知 × 动态调度”的交通枢纽空间智能中枢
  • 别再只做静态分析了!用DPABI解锁小鼠脑功能动态连接(Temporal Dynamic Analysis详解)
  • 用Maven打包SpringBoot项目的正确姿势:从配置到验证的保姆级指南
  • MacBook上5分钟搞定JMeter环境:从JDK检查到永久汉化(保姆级避坑指南)
  • 别再只盯着比特币挖矿了!手把手带你搞懂PoW、PoS、DPoS到底该怎么选(附实战场景分析)