wolfcode/rate-limiting

php rate-limiting

v0.1.2 2025-03-05 06:59 UTC

This package is auto-updated.

Last update: 2025-03-07 03:00:29 UTC


README

1. Require

php >= 8.1

Redis

2. Install

composer require "wolfcode/rate-limiting"

3. Usage

use Wolfcode\RateLimiting\Attributes\RateLimitingMiddleware;

class Test
{
    // 每1秒只能请求1次
    // Only one request can be made per second
    #[RateLimitingMiddleware(key: 'test', seconds: 1, limit: 1, message: '请求过于频繁~')]
    public function index(Request $request): string
    
    // 每60秒只能请求100次
    // Only 100 requests can be made every 60 seconds
    #[RateLimitingMiddleware(key: 'test', seconds: 60, limit: 100, message: '你好快啊,我好喜欢~')]
    public function index(Request $request): string
    
    // 每3秒只能请求10次 key可以使用数组回调方式 参考下方例子
    // Only 10 key requests can be made every 3 seconds. An array callback method can be used, as shown in the example below
    #[RateLimitingMiddleware(key: [Some:class,'getIp'], seconds: 3, limit: 10, message: '我记住你了~')]
    public function index(Request $request): string
    
    // 每3秒只能请求10次 key可以使用数组回调方式 参考下方例子
    // Only 10 key requests can be made every 3 seconds. An array callback method can be used, as shown in the example below
    #[RateLimitingMiddleware(key: [Some:class,'customIp'], seconds: 3, limit: 10, message: '我记住你了~'),args:[__METHOD__])]
    public function index(Request $request): string
}


// 需要自行创建一个 Some 类 并且存在静态方法 getIp
// Need to create a Some class on your own and have a static method getIp
class Some
{
    public static function getIp(): string
    {
        return $request->ip();
    }
    
    public static function customIp(...$args): string
    {
        return $args[0] . $request->ip();
    }
}

4. Suggestion

可以在 .env 文件中设置一个 RATE_LIMITING_STATUS 开关,来控制是否开启限流

建议在中间件中使用

You can set a RATE_LIMITING-STATUS switch in the. env file to control whether to enable current limiting

Suggest using it in middleware

5. Example

ThinkPHP8.1

<?php

namespace app\admin\middleware;

use app\common\traits\JumpTrait;
use app\Request;
use Closure;
use Wolfcode\RateLimiting\Bootstrap;

class RateLimiting
{
    use JumpTrait;

    /**
     * 启用限流器需要开启Redis
     * @param Request $request
     * @param Closure $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next): mixed
    {
        // 是否启用限流器
        if (!env('RATE_LIMITING_STATUS', false)) return $next($request);

        $controller      = $request->controller();
        $module          = app('http')->getName();
        $appNamespace    = config('app.app_namespace');
        $controllerClass = "app\\{$module}\\controller\\{$controller}{$appNamespace}";
        $controllerClass = str_replace('.', '\\', $controllerClass);
        $action          = $request->action();
        try {
            Bootstrap::init($controllerClass, $action, [
                # Redis 相关配置
                'host'     => env('REDIS_HOST', '127.0.0.1'),
                'port'     => (int)env('REDIS_PORT', 6379),
                'password' => env('REDIS_PASSWORD', ''),
                'prefix'   => env('REDIS_PREFIX', ''),
                'database' => (int)env('REDIS_DATABASE', 0),
            ]);
        }catch (\Throwable $exception) {
            $this->error($exception->getMessage());
        }
        return $next($request);
    }
}