{"id":19832946,"url":"https://github.com/tinywan/webman-limit-traffic","last_synced_at":"2025-10-10T05:14:25.884Z","repository":{"id":47573403,"uuid":"475929605","full_name":"Tinywan/webman-limit-traffic","owner":"Tinywan","description":" based on lua script limiting and controlling traffic for webman plugin","archived":false,"fork":false,"pushed_at":"2025-07-20T12:33:40.000Z","size":55,"stargazers_count":17,"open_issues_count":3,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-09-26T16:52:25.958Z","etag":null,"topics":["controlling","limiting","php","plugin","redis","redis-lua-script","tinywan","traffic","webman","workerman"],"latest_commit_sha":null,"homepage":"https://www.workerman.net/plugin/37","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Tinywan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-03-30T15:01:04.000Z","updated_at":"2025-09-06T08:16:16.000Z","dependencies_parsed_at":"2022-08-28T21:11:45.367Z","dependency_job_id":null,"html_url":"https://github.com/Tinywan/webman-limit-traffic","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/Tinywan/webman-limit-traffic","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tinywan%2Fwebman-limit-traffic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tinywan%2Fwebman-limit-traffic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tinywan%2Fwebman-limit-traffic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tinywan%2Fwebman-limit-traffic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Tinywan","download_url":"https://codeload.github.com/Tinywan/webman-limit-traffic/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tinywan%2Fwebman-limit-traffic/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279002796,"owners_count":26083468,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-10T02:00:06.843Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["controlling","limiting","php","plugin","redis","redis-lua-script","tinywan","traffic","webman","workerman"],"created_at":"2024-11-12T11:39:04.697Z","updated_at":"2025-10-10T05:14:25.876Z","avatar_url":"https://github.com/Tinywan.png","language":"PHP","readme":"# based on lua script limiting traffic for webman plugin\n\n[![Latest Stable Version](http://poser.pugx.org/tinywan/limit-traffic/v)](https://packagist.org/packages/tinywan/limit-traffic) [![Total Downloads](http://poser.pugx.org/tinywan/limit-traffic/downloads)](https://packagist.org/packages/tinywan/limit-traffic) [![Latest Unstable Version](http://poser.pugx.org/tinywan/limit-traffic/v/unstable)](https://packagist.org/packages/tinywan/limit-traffic) [![License](http://poser.pugx.org/tinywan/limit-traffic/license)](https://packagist.org/packages/tinywan/limit-traffic)\n\n为防止滥用，你应该考虑对您的 API 限流。 例如，您可以限制每个用户 10 分钟内最多调用 API 100 次。 如果在规定的时间内接收了一个用户大量的请求，将返回响应状态代码 429 (这意味着过多的请求)。\n## 安装\n\n```shell\ncomposer require tinywan/limit-traffic\n```\n\n## 使用\n\n### 应用中间件\n\n在 `config/middleware.php` 中添加全局中间件如下：\n\n```php\nreturn [\n    // 全局中间件\n    '' =\u003e [\n        // ... 这里省略其它中间件\n        Tinywan\\LimitTraffic\\Middleware\\LimitTrafficMiddleware::class,\n    ],\n    // api应用中间件\n    'api' =\u003e [\n        Tinywan\\LimitTraffic\\Middleware\\LimitTrafficMiddleware::class,\n    ]\n];\n```\n\n### 路由中间件\n\n\u003e 注意：需要 `workerman/webman-framework` 版本 `\u003e= 1.0.12`\n\n我们可以给某个一个或某一组路由设置中间件。例如在 `config/route.php` 中添加如下配置：\n\n```php\nRoute::any('/admin', [app\\admin\\controller\\Index::class, 'index'])\n-\u003emiddleware([Tinywan\\LimitTraffic\\Middleware\\LimitTrafficMiddleware::class]);\n\n// 分组路由\nRoute::group('/blog', function () {\n   Route::any('/create', function () {return response('create');});\n})-\u003emiddleware([Tinywan\\LimitTraffic\\Middleware\\LimitTrafficMiddleware::class]);\n```\n\n## 🔏 返回允许的请求的最大数目及时间\n\n返回允许的请求的最大数目及时间，例如：`[100, 600]` 表示在 `600` 秒内最多 `100` 次的 API 调\n```php\nTinywan\\LimitTraffic\\RateLimiter::getRateLimit(); // 返回 [100, 600]\n```\n\n## ⚠ 请求限制参考\n\n![rate-limit.png](./rate-limit.png)\n\n## 🔰 响应参数详解\n\n- `X-Rate-Limit-Limit` 同一个时间段所允许的请求的最大数目\n- `X-Rate-Limit-Remaining` 在当前时间段内剩余的请求的数量\n- `X-Rate-Limit-Reset` 为了得到最大请求数所等待的秒数\n\n## 自定义自己的 Response\n\n\u003e 使用场景\n- 每个项目有标准的统一输出，自定义返回内容\n- 前后端分离：前端要求返回的 `HTTP状态码`并不是 `429`，而是 `200` 或者其他\n- 响应的`body`不是 `{\"code\":0,\"msg\":\"Too Many Requests\"}`，而是 `{\"error_code\":200,\"message\":\"Too Many Requests\"}`等其他内容\n\n### 自定义HTTP状态码\n\n编辑 `config/plugin/tinywan/limit-traffic/app.php` 文件的 `status` HTTP 状态码（默认值是 `429`）\n\n### 自定义限流键\n\n编辑 `config/plugin/tinywan/limit-traffic/app.php` 文件的 `limit_key` 限流键（默认值是 `none`）\n\n- `none 代表以ip作为限流键`\n- `get.id 代表以get请求的id作为限流键`\n- `post.access 代表以post请求的access作为限流键`\n- `header.token 代表以header请求的token作为限流键`\n\n### 自定义`body`返回内容\n\n编辑 `config/plugin/tinywan/limit-traffic/app.php` 文件的 `body` 的字段\n\n**默认选项是**\n```json\n{\n\t\"code\": 0,\n\t\"msg\": \"Too Many Requests\",\n\t\"data\": null\n}\n```\n**自定义选项参考一**\n\n1、假设`status` HTTP 状态码设置为 `200`\n\n2、假设`body`的数组设为为\n\n```php\n'body' =\u003e [\n\t'error_code' =\u003e 200,\n\t'message' =\u003e '请求太多请稍后重试'\n]\n```\n\n则响应内容为\n```json\nHTTP/1.1 200 OK\nContent-Type: application/json;charset=UTF-8\n\n{\n\t\"error_code\": 200,\n\t\"message\": \"请求太多请稍后重试\"\n}\n```\n其他的可以根据自身业务自定义即可\n\n## Other\n\n```php\nvendor/bin/phpstan analyse src\n\nvendor/bin/php-cs-fixer fix src\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftinywan%2Fwebman-limit-traffic","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftinywan%2Fwebman-limit-traffic","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftinywan%2Fwebman-limit-traffic/lists"}