Maison  >  Article  >  développement back-end  >  Composant de limitation de contre-courant disponible pour PHP Hyperf (configuration d'installation)

Composant de limitation de contre-courant disponible pour PHP Hyperf (configuration d'installation)

藏色散人
藏色散人avant
2022-01-11 15:31:555312parcourir

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 进行了补充. 增加了以下方法:

  • increment
  • decrement
  • add
  • put

安装

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_attemptsdecay_minutes 不起作用.

如果你的缓存驱动不是 redis, 可以使用 CounterRateLimit 注解,反之则直接使用 CounterRateLimitWithRedis 注解即可.

在其他地方使用限速时, 可以使用辅助函数 counter_limiter(), 使用方法同 laravel中的 RateLimiter Facade

  • incrément. li>
  • décrémenter
  • ajouter
  • put
span>

Installation

$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.
🎜2 Dans le fichier de configuration des exceptions Ajouté : 🎜rrreee🎜🎜. Facultatif, vous pouvez également l'attraper vous-même. Cette exception est fournie avec une méthode 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.
Lors de l'utilisation de 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer