速率限制

Introduction

Laravel 包含一个简单易用的速率限制抽象,它与您的应用程序的cache, 提供了一种简单的方法来限制指定时间窗口内的任何操作。

Note
如果您对限制传入 HTTP 请求的速率感兴趣,请参阅速率限制器中间件文档.

缓存配置

通常,速率限制器使用您的默认应用程序缓存,如default 应用程序中的密钥cache 配置文件。但是,您可以通过定义一个limiter 应用程序中的密钥cache 配置文件:

'default' => 'memcached',

'limiter' => 'redis',

基本用法

Illuminate\Support\Facades\RateLimiter facade 可用于与速率限制器交互。速率限制器提供的最简单的方法是attempt 方法,该速率限制给定秒数的给定回调。

attempt 方法返回false 当回调没有可用的剩余尝试时;否则,attempt 方法将返回回调的结果或true.接受的第一个论点attempt method 是一个速率限制器“键”,它可以是您选择的任何字符串,代表被速率限制的操作:

use Illuminate\Support\Facades\RateLimiter;

$executed = RateLimiter::attempt(
    'send-message:'.$user->id,
    $perMinute = 5,
    function() {
        // Send message...
    }
);

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

手动增加尝试次数

如果您想手动与速率限制器交互,可以使用多种其他方法。例如,您可以调用tooManyAttempts 确定给定速率限制器密钥是否超过其每分钟允许的最大尝试次数的方法:

use Illuminate\Support\Facades\RateLimiter;

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

或者,您可以使用remaining 方法来检索给定键的剩余尝试次数。如果给定的密钥有剩余的重试次数,您可以调用hit 增加总尝试次数的方法:

use Illuminate\Support\Facades\RateLimiter;

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

    // Send message...
}

确定限制器可用性

当一个键没有更多的尝试时,availableIn 方法返回剩余的秒数,直到可以进行更多尝试:

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.';
}

清除尝试

您可以使用clear 方法。例如,您可以重置接收者阅读给定消息时的尝试次数:

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

/**
 * Mark the message as read.
 */
public function read(Message $message): Message
{
    $message->markAsRead();

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

    return $message;
}
豫ICP备18041297号-2