0

0

Laravel中间件怎么做限流_LaravelAPI限流中间件实现【指南】

絕刀狂花

絕刀狂花

发布时间:2026-03-19 10:19:35

|

175人浏览过

|

来源于php中文网

原创

直接用 Laravel 自带的 throttle 中间件,它已支持 Redis、数据库后备、动态 key 生成和防穿透;自行实现易出现并发竞争、时间窗口漂移、跨服务器不一致等问题。

laravel中间件怎么做限流_laravelapi限流中间件实现【指南】

限流中间件该用 throttle 还是自己写?

直接用 Laravel 自带的 throttle 中间件,别手撸——它已支持 Redis、数据库后备、动态 key 生成,且默认防穿透(比如带随机参数的请求不会绕过计数)。自己实现容易漏掉并发竞争、时间窗口漂移、跨服务器不一致这些坑。

常见错误现象:ThrottleRequestsException 频繁抛出但日志没记录;或限流在本地开发正常,上线后完全失效(Redis 配置未生效)。

  • 确认 CACHE_DRIVERREDIS_CLIENT 在生产环境指向真实 Redis,而非 arrayfile
  • 检查 config/cache.phpdefault 是否与 throttle 实际使用的 store 一致(它默认走 cache store,不是 redis
  • 若需按用户角色差异化限流(如 VIP 每分钟 500 次),不要改中间件源码,用闭包式 key: throttle:60,500,reset_in=3600,by=id + 自定义 resolveKey

API 路由限流时怎么区分「登录用户」和「游客」?

Request 对象本身判断,而不是在中间件里硬写 Auth::id()——后者在 API 路由中可能因 guard 未切换而返回 null。

使用场景:游客限流 10 次/分钟,登录用户 100 次/分钟,JWT 和 session 登录都要兼容。

  • 在路由定义里用闭包语法:middleware('throttle:10,1|100,1,by=throttle_key')
  • App\Http\Middleware\EnsureThrottleKeyIsSet.php 中动态设置:$request->attributes->set('throttle_key', $request->user() ? 'user_'.$request->user()->id : 'guest_'.($request->ip() ?: 'unknown'))
  • 避免用 session_id() 区分游客——无状态 API 下 session 可能未启动,且移动端 IP 复用率高,易误杀

throttle 中的 reset_in 参数到底影响什么?

它只控制 HTTP 响应头 X-RateLimit-Reset 的值,**不影响实际限流逻辑**。真正决定窗口期的是第二个参数(如 throttle:60,100 中的 100)背后的存储策略:Laravel 默认用「滑动窗口」(基于 Redis ZSET),reset_in 不参与计算。

像素蛋糕PixCake
像素蛋糕PixCake

像素级AI图像精修软件

下载

性能影响:设过大的 reset_in(比如 reset_in=86400)会让前端误以为“今天彻底禁了”,但后端其实每分钟都在滚动统计——这会造成体验断层。

  • 建议保持 reset_in 与速率单位一致:throttle:60,100,reset_in=60
  • 不要依赖它做业务逻辑分支(比如“重置后发短信”),要用独立定时任务清理 Redis key 或监听 RateLimitingAttempted 事件
  • 如果真需要固定窗口(如“每天最多 5 次”),得换方案:throttle:1,5,by=uid,window=86400 不行,得用自定义中间件 + Cache::add("rate_limit:uid:{$uid}", 1, 86400)

为什么加了 throttle 但 Postman 测试一直 200?

大概率是当前请求没命中你写的那个中间件规则——Laravel 的 throttle 是按路由组或单个路由绑定的,不是全局生效。另外,测试时用的账号可能被缓存或共享了限流 key。

排查步骤:

  • 运行 php artisan route:list --middleware=throttle,确认目标路由确实绑定了 throttle
  • 在中间件里临时加日志:Log::debug('throttle key: '.app(\Illuminate\Routing\Router::class)->getRateLimiter()->getKey($request, 'api'))
  • Postman 测试时关掉所有 Cookie,清空 Header 中的 Authorization,排除 token 复用导致 key 相同
  • 检查是否启用了 APP_DEBUG=false 却没配好 LOG_CHANNEL=stack,导致日志根本没写入

最容易被忽略的一点:Laravel 10+ 默认把 API 路由放在 routes/api.php,而这个文件里注册的路由自动加了 api 中间件组——如果你在 app/Http/Kernel.php 里把 throttle:api 写进了 web 组,那对 API 根本不生效。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

341

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

296

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

795

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

387

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

167

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

86

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

84

2025.08.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

855

2026.03.04

bootstrap安装教程
bootstrap安装教程

本专题整合了bootstrap安装相关教程,阅读专题下面的文章了解更多详细操作教程。

22

2026.03.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.7万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号