Maison > Article > développement back-end > Composant de limitation de contre-courant disponible pour PHP Hyperf (configuration d'installation)
Cet article vous présente le composant de limitation de contre-courant adapté à Hyperf. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.
Description
BETA
Portage du limiteur de débit du composant Laravel Cache.
et ajout de PsrSimpleCacheCacheInterface
Ajout des méthodes suivantes :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!'; }🎜Configuration🎜🎜🎜1 Modifier le fichier de configuration du cache :🎜rrreee
pour correspond à <code>Laravel Facade
RateLimiter::for(callable)
,🎜🎜Lorsque le service démarre, l'écouteur collectera le tableau du limiteur nommé pour l'annotation Utiliser for Lorsque l'aspect d'annotation est exécuté, l'instance de requête actuelle <code>HyperfHttpServerContractRequestInterface
sera injectée dans la fermeture nommée.🎜🎜key
. par défaut, la requête actuelle fullUrl
+ ip
. Prend en charge les chaînes et les fermetures.getHeaders
, la valeur est : array('X-RateLimit-Limit', 'X-RateLimit-Remaining' , 'Retry-After ', 'X-RateLimit-Reset')🎜🎜🎜🎜Utilisez 🎜🎜🎜Utilisez l'annotation de limite de débit du compteur dans le contrôleur 🎜rrreee🎜🎜Le les paramètres d'annotation sont les mêmes que ceux du fichier de configuration et la priorité est Annotation>Configuration>Par défaut.for
, max_attempts
et decay_minutes
ne fonctionne pas. 🎜🎜🎜Si votre pilote de cache n'est pas redis
, vous pouvez utiliser l'annotation CounterRateLimit
. Sinon, utilisez l'annotation CounterRateLimitWithRediscode> directement. C'est tout.🎜🎜Lorsque vous utilisez la limitation de débit à d'autres endroits, vous pouvez utiliser la fonction auxiliaire <code>counter_limiter()
. La méthode d'utilisation est la même que celle de RateLimiter Facadecode> dans <code>laravel
, vous pouvez vous référer au document de limitation actuel de Laravel🎜rrreee🎜Apprentissage recommandé : "🎜Tutoriel vidéo PHP🎜"🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!