Skip to content

Rate Limiting (Giới hạn tần suất)

Giới thiệu (Introduction)

Laravel bao gồm rate limiting abstraction dễ sử dụng, kết hợp với cache, cung cấp cách đơn giản để giới hạn action trong khoảng thời gian nhất định.

Định nghĩa Rate Limiters

Trong AppServiceProvider method boot:

php
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;

RateLimiter::for('api', function (Request $request) {
    return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});

Nhiều Limits

php
RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->isPremium()
        ? Limit::none()
        : Limit::perMinute(10)->by($request->ip());
});

Segmented Limits

php
RateLimiter::for('uploads', function (Request $request) {
    return [
        Limit::perMinute(10),       // 10/phút
        Limit::perDay(1000)->by($request->user()->id), // 1000/ngày per user
    ];
});

HTTP Rate Limiting

Áp dụng middleware throttle cho routes:

php
Route::middleware(['throttle:uploads'])->group(function () {
    Route::post('/upload', function () {
        // ...
    });
});

Throttle mặc định

php
Route::middleware('throttle:60,1')->group(function () {
    // 60 requests per minute
});

Rate Limiting thủ công

php
use Illuminate\Support\Facades\RateLimiter;

$executed = RateLimiter::attempt(
    'send-message:' . $user->id,    // key
    $perMinute = 5,                  // max attempts
    function () {                    // callback
        // Gửi message...
    },
);

if (! $executed) {
    return 'Quá nhiều requests!';
}

Kiểm tra Attempts

php
if (RateLimiter::tooManyAttempts('send-message:' . $user->id, $perMinute = 5)) {
    $seconds = RateLimiter::availableIn('send-message:' . $user->id);
    return "Vui lòng thử lại sau {$seconds} giây.";
}

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

Reset Rate Limiter

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