이 글에서는 Hyperf에 적합한 역전류 제한 부품을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
Description
BETA
Laravel Cache 구성 요소의 속도 제한기를 이식했습니다.
및 PsrSimpleCacheCacheInterface
를 추가했습니다.PsrSimpleCacheCacheInterface
进行了补充. 增加了以下方法:
安装
composer require wilbur-yu/hyperf-cache-ext
配置
1. 修改cache配置文件:
'default' => [ 'driver' => WilburYu\HyperfCacheExt\Driver\RedisDriver::class, 'packer' => WilburYu\HyperfCacheExt\Utils\Packer\PhpSerializerPacker::class, 'prefix' => env('APP_NAME', 'skeleton').':cache:', ], 'limiter' => [ 'max_attempts' => 5, // 最大允许次数 'decay_minutes' => 1, // 限流单位时间 'prefix' => 'counter-rate-limit:', // key 前缀 'for' => [ 'common' => static function (\Hyperf\HttpServer\Contract\RequestInterface $request) { return Limit::perMinute(3); }, ], 'key' => ThrottleRequest::key(), ],
for
即对应 Laravel Facade
RateLimiter::for(callable)
,在服务启动时, 监听器会收集该命名限制器数组, 供在注解中使用
for
参数引用. 在注解切面执行时, 会将当前请求HyperfHttpServerContractRequestInterface
实例注入到该命名闭包.
key
默认为当前请求 fullUrl
+ ip
. 支持字符串与闭包.2. 在exceptions配置文件中增加:
\WilburYu\HyperfCacheExt\Exception\Handler\CounterRateLimitException::class
可选, 也可自行捕获, 该异常自带一个
getHeaders
方法, 值为: array(‘X-RateLimit-Limit’, ‘X-RateLimit-Remaining’, ‘Retry-After’, ‘X-RateLimit-Reset’)
使用
在控制器中使用计数器限速注解
#[CounterRateLimitWithRedis(maxAttempts: 5, decayMinutes: 1)]or#[CounterRateLimit(for: "common")]
注解参数同配置文件, 优先级为注解>配置>默认.
使用for
时,max_attempts
和decay_minutes
不起作用.
如果你的缓存驱动不是 redis
, 可以使用 CounterRateLimit
注解,反之则直接使用 CounterRateLimitWithRedis
注解即可.
在其他地方使用限速时, 可以使用辅助函数 counter_limiter()
, 使用方法同 laravel
中的 RateLimiter Facade
$executed = counter_limiter()->attempt('send-sms:'.$user->id,2,function(){ // send sms logic }); if (!$executed) { return 'Too many messages sent!'; }
for
는 Laravel Facade
RateLimiter::for(callable)
에 해당합니다.🎜🎜서비스가 시작되면 리스너는 주석을 위해 명명된 제한 배열을 수집합니다. for 매개변수 참조입니다. 주석 측면이 실행되면 현재 요청 <code>HyperfHttpServerContractRequestInterface
인스턴스가 명명된 클로저에 주입됩니다.🎜🎜
key
기본값은 현재 요청 fullUrl
+ ip
입니다. 문자열 및 클로저를 지원합니다.getHeaders
메소드와 함께 제공되며 값은 array('X-RateLimit-Limit', 'X-RateLimit-Remaining' , 'Retry-After)입니다. ', 'X-RateLimit-Reset')🎜🎜🎜🎜사용 🎜🎜🎜컨트롤러의 카운터 속도 제한 주석 사용 🎜rrreee🎜🎜The 주석 매개변수는 구성 파일의 매개변수와 동일하며 우선순위는 Annotation>Configuration>Default입니다.for
를 사용하는 경우 max_attempts
및 decay_ Minutes
가 작동하지 않습니다. 🎜🎜🎜캐시 드라이버가 redis
가 아닌 경우 CounterRateLimit
주석을 사용할 수 있습니다. 그렇지 않으면 CounterRateLimitWithRedis code> 주석을 직접 사용하면 됩니다.🎜🎜다른 곳에서 속도 제한을 사용할 때는 보조 함수인 <code>counter_limiter()
를 사용하면 됩니다. 사용법은 RateLimiter Facade
와 동일합니다. code> laravel
에서 Laravel 현재 제한 문서🎜rrreee🎜권장 학습: "🎜PHP 비디오 튜토리얼🎜"🎜을 참조할 수 있습니다.위 내용은 PHP Hyperf에 사용 가능한 카운터 전류 제한 구성요소(설치 구성)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!