首頁  >  文章  >  後端開發  >  可用於PHP Hyperf的計數器限流元件(安裝配置)

可用於PHP Hyperf的計數器限流元件(安裝配置)

藏色散人
藏色散人轉載
2022-01-11 15:31:555300瀏覽

本篇文章要為大家介紹關於適用於 Hyperf 的計數器限流元件。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

說明

BETA

移植了Laravel Cache 元件的rate-limiter.

並對\Psr\SimpleCache\CacheInterface 進行了補充. 增加了以下方法:

  • 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 參數參考. 在註解切面執行時, 會將目前請求\Hyperf\ HttpServer\Contract\RequestInterface 實例注入到該命名閉包.

  • 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, 可參考Laravel 限流文件

$executed = counter_limiter()->attempt('send-sms:'.$user->id,2,function(){
    // send sms logic
});
if (!$executed) {
    return 'Too many messages sent!';
}

推薦學習:《PHP影片教學

以上是可用於PHP Hyperf的計數器限流元件(安裝配置)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除