Giao diện
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);