Readouble

Laravel 10.x レート制限

イントロダクションIntroduction

Laravelには、簡単に使用できるレート制限の抽象化機能があり、アプリケーションのcacheと連携して、指定した時間帯のアクションを制限する簡単な方法を提供します。Laravel includes a simple to use rate limiting abstraction which, in conjunction with your application's cache[cache], provides an easy way to limit any action during a specified window of time.

lightbulb Note: 受信HTTPリクエストのレートを制限したい場合は、レート制限ミドルウェアのドキュメントを参照してください。[!NOTE]
If you are interested in rate limiting incoming HTTP requests, please consult the rate limiter middleware documentation[routing#rate-limiting].

キャッシュ設定Cache Configuration

通常、レート制限では、アプリケーションのcache設定ファイルのdefaultキーで定義されているデフォルトのアプリケーションキャッシュを使用します。しかし、アプリケーションのcache設定ファイル内でlimiterキーを定義すれば、レート制限で使用するキャッシュドライバを指定できます。Typically, the rate limiter utilizes your default application cache as defined by the default key within your application's cache configuration file. However, you may specify which cache driver the rate limiter should use by defining a limiter key within your application's cache configuration file:

'default' => 'memcached',

'limiter' => 'redis',

基本の使い方Basic Usage

Illuminate\Support\Facades\RateLimiterファサードを使って、レート制限を操作できます。レート制限が提供する最もシンプルなメソッドはattemptメソッドで、これは指定されたコールバックを指定された秒数でレート制限するものです。The Illuminate\Support\Facades\RateLimiter facade may be used to interact with the rate limiter. The simplest method offered by the rate limiter is the attempt method, which rate limits a given callback for a given number of seconds.

attemptメソッドは、コールバックで利用できる残り試行回数がない場合は、falseを返し、そうでない場合には、attemptメソッドはコールバックの結果、またはtrueを返します。attempt`メソッドが受け付ける最初の引数は、レート制限の「キー」で、レート制限をかけるアクションを表す任意の文字列を指定します。The attempt method returns false when the callback has no remaining attempts available; otherwise, the attempt method will return the callback's result or true. The first argument accepted by the attempt method is a rate limiter "key", which may be any string of your choosing that represents the action being rate limited:

use Illuminate\Support\Facades\RateLimiter;

$executed = RateLimiter::attempt(
    'send-message:'.$user->id,
    $perMinute = 5,
    function() {
        // メッセージ送信…
    }
);

if (! $executed) {
  return 'Too many messages sent!';
}

必要であれば、attemptメソッドに第4引数を与えられます。これは「減衰率」、または試行が利用可能になるまでのリセット秒数です。例として、上記のサンプルコードを修正して、2分ごとに5回の試行するようにしてみます。If necessary, you may provide a fourth argument to the attempt method, which is the "decay rate", or the number of seconds until the available attempts are reset. For example, we can modify the example above to allow five attempts every two minutes:

$executed = RateLimiter::attempt(
    'send-message:'.$user->id,
    $perTwoMinutes = 5,
    function() {
        // メッセージ送信…
    },
    $decayRate = 120,
);

試行回数の手作業増加Manually Incrementing Attempts

レート制限を手作業で操作する場合は、他にもさまざまな方法があります。たとえば、tooManyAttemptsメソッドを呼び出して、指定したレート制限キーが1分間に許可した最大試行回数を超えたかを判断できます。If you would like to manually interact with the rate limiter, a variety of other methods are available. For example, you may invoke the tooManyAttempts method to determine if a given rate limiter key has exceeded its maximum number of allowed attempts per minute:

use Illuminate\Support\Facades\RateLimiter;

if (RateLimiter::tooManyAttempts('send-message:'.$user->id, $perMinute = 5)) {
    return 'Too many attempts!';
}

RateLimiter::increment('send-message:'.$user->id);

// メッセージ送信処理…

他にも、remainingメソッドを使って、指定キーの残りの試行回数を取得することも可能です。指定キーに再試行回数が残っている場合は、incrementメソッドを呼び出して総試行回数を増やせます。Alternatively, you may use the remaining method to retrieve the number of attempts remaining for a given key. If a given key has retries remaining, you may invoke the increment method to increment the number of total attempts:

use Illuminate\Support\Facades\RateLimiter;

if (RateLimiter::remaining('send-message:'.$user->id, $perMinute = 5)) {
    RateLimiter::increment('send-message:'.$user->id);

    // メッセージ送信処理…
}

指定するレートリミッターキーの値を1以上増やしたい場合は、incrementメソッドへ希望する量を指定してください。If you would like to increment the value for a given rate limiter key by more than one, you may provide the desired amount to the increment method:

RateLimiter::increment('send-message:'.$user->id, amount: 5);

使用可能時間の判断Determining Limiter Availability

キーの試行回数がなくなると、availableInメソッドは試行回数が増えるまでの残り秒数を返します。When a key has no more attempts left, the availableIn method returns the number of seconds remaining until more attempts will be available:

use Illuminate\Support\Facades\RateLimiter;

if (RateLimiter::tooManyAttempts('send-message:'.$user->id, $perMinute = 5)) {
    $seconds = RateLimiter::availableIn('send-message:'.$user->id);

    return 'You may try again in '.$seconds.' seconds.';
}

RateLimiter::increment('send-message:'.$user->id);

// メッセージ送信処理…

試行のクリアClearing Attempts

clearメソッドを使って、任意のレート制限キーの試行回数をリセットできます。例えば、指定メッセージが受信者によって読まれたときに試行回数をリセットできます。You may reset the number of attempts for a given rate limiter key using the clear method. For example, you may reset the number of attempts when a given message is read by the receiver:

use App\Models\Message;
use Illuminate\Support\Facades\RateLimiter;

/**
 * メッセージを既読としてマーク
 */
public function read(Message $message): Message
{
    $message->markAsRead();

    RateLimiter::clear('send-message:'.$message->user_id);

    return $message;
}

章選択

設定

明暗テーマ
light_mode
dark_mode
brightness_auto システム設定に合わせる
テーマ選択
photo_size_select_actual デフォルト
photo_size_select_actual モノクローム(白黒)
photo_size_select_actual Solarized風
photo_size_select_actual GitHub風(青ベース)
photo_size_select_actual Viva(黄緑ベース)
photo_size_select_actual Happy(紫ベース)
photo_size_select_actual Mint(緑ベース)
コードハイライトテーマ選択

明暗テーマごとに、コードハイライトのテーマを指定できます。

テーマ配色確認
スクリーン表示幅
640px
80%
90%
100%

768px以上の幅があるときのドキュメント部分表示幅です。

インデント
無し
1rem
2rem
3rem
原文確認
原文を全行表示
原文を一行ずつ表示
使用しない

※ 段落末のEボタンへカーソルオンで原文をPopupします。

Diff表示形式
色分けのみで区別
行頭の±で区別
削除線と追記で区別

※ [tl!…]形式の挿入削除行の表示形式です。

テストコード表示
両コード表示
Pestのみ表示
PHPUnitのみ表示
和文変換

対象文字列と置換文字列を半角スペースで区切ってください。(最大5組各10文字まで)

本文フォント

総称名以外はCSSと同様に、"〜"でエスケープしてください。

コードフォント

総称名以外はCSSと同様に、"〜"でエスケープしてください。

保存内容リセット

localStrageに保存してある設定項目をすべて削除し、デフォルト状態へ戻します。

ヘッダー項目移動

キーボード操作