webman-limit-traffic
                                
                                 webman-limit-traffic copied to clipboard
                                
                                    webman-limit-traffic copied to clipboard
                            
                            
                            
                        based on lua script limiting and controlling traffic for webman plugin
based on lua script limiting traffic for webman plugin
为防止滥用,你应该考虑对您的 API 限流。 例如,您可以限制每个用户 10 分钟内最多调用 API 100 次。 如果在规定的时间内接收了一个用户大量的请求,将返回响应状态代码 429 (这意味着过多的请求)。
安装
composer require tinywan/limit-traffic
使用
应用中间件
在 config/middleware.php 中添加全局中间件如下:
return [
    // 全局中间件
    '' => [
        // ... 这里省略其它中间件
        Tinywan\LimitTraffic\Middleware\LimitTrafficMiddleware::class,
    ],
    // api应用中间件
    'api' => [
        Tinywan\LimitTraffic\Middleware\LimitTrafficMiddleware::class,
    ]
];
路由中间件
注意:需要
workerman/webman-framework版本>= 1.0.12
我们可以给某个一个或某一组路由设置中间件。例如在 config/route.php 中添加如下配置:
Route::any('/admin', [app\admin\controller\Index::class, 'index'])
->middleware([Tinywan\LimitTraffic\Middleware\LimitTrafficMiddleware::class]);
// 分组路由
Route::group('/blog', function () {
   Route::any('/create', function () {return response('create');});
})->middleware([Tinywan\LimitTraffic\Middleware\LimitTrafficMiddleware::class]);
🔏 返回允许的请求的最大数目及时间
返回允许的请求的最大数目及时间,例如:[100, 600] 表示在 600 秒内最多 100 次的 API 调
Tinywan\LimitTraffic\RateLimiter::getRateLimit(); // 返回 [100, 600]
⚠ 请求限制参考

🔰 响应参数详解
- X-Rate-Limit-Limit同一个时间段所允许的请求的最大数目
- X-Rate-Limit-Remaining在当前时间段内剩余的请求的数量
- X-Rate-Limit-Reset为了得到最大请求数所等待的秒数
自定义自己的 Response
使用场景
- 每个项目有标准的统一输出,自定义返回内容
- 前后端分离:前端要求返回的 HTTP状态码并不是429,而是200或者其他
- 响应的body不是{"code":0,"msg":"Too Many Requests"},而是{"error_code":200,"message":"Too Many Requests"}等其他内容
自定义HTTP状态码
编辑 config/plugin/tinywan/limit-traffic/app.php 文件的 status HTTP 状态码(默认值是 429)
自定义body返回内容
编辑 config/plugin/tinywan/limit-traffic/app.php 文件的 body 的字段
默认选项是
{
	"code": 0,
	"msg": "Too Many Requests",
	"data": null
}
自定义选项参考一
1、假设status HTTP 状态码设置为 200
2、假设body的数组设为为
'body' => [
	'error_code' => 200,
	'message' => '请求太多请稍后重试'
]
则响应内容为
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
	"error_code": 200,
	"message": "请求太多请稍后重试"
}
其他的可以根据自身业务自定义即可
Other
vendor/bin/phpstan analyse src
vendor/bin/php-cs-fixer fix src