نسخه:

محدود کردن نرخ

معرفی

لاراول شامل یک انتزاع محدود کننده نرخ است که در ارتباط با حافظه پنهان برنامه شما ، راهی آسان برای محدود کردن هر اقدامی در طول یک پنجره زمانی مشخص را فراهم می‌کند.

اگر علاقه مند به محدود کردن نرخ درخواست های HTTP ورودی هستید، لطفاً به اسناد میان افزار محدود کننده نرخ مراجعه کنید .

پیکربندی کش

به طور معمول، محدود کننده نرخ از حافظه پنهان برنامه پیش فرض شما همانطور که توسط default کلید داخل فایل پیکربندی برنامه شما تعریف شده است، استفاده می کند cache . با این حال، می‌توانید با تعریف limiter کلیدی در فایل پیکربندی برنامه، تعیین کنید که محدودکننده نرخ از کدام درایور کش استفاده کند cache :

'default' => 'memcached',
 
'limiter' => 'redis',

استفاده پایه

نما Illuminate\Support\Facades\RateLimiter ممکن است برای تعامل با محدود کننده نرخ استفاده شود. ساده ترین روش ارائه شده توسط محدود کننده نرخ attempt ، روشی است که نرخ یک تماس معین را برای تعداد معینی از ثانیه محدود می کند.

این attempt روش false زمانی برمی‌گردد که پاسخ تماس هیچ تلاشی در دسترس نداشته باشد. در غیر این صورت، attempt متد نتیجه تماس یا true . اولین آرگومان پذیرفته شده توسط این attempt روش یک "کلید" محدود کننده نرخ است، که ممکن است هر رشته ای از انتخاب شما باشد که نشان دهنده عملکرد محدود با نرخ است:

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.
*
* @param \App\Models\Message $message
* @return \App\Models\Message
*/
public function read(Message $message)
{
$message->markAsRead();
 
RateLimiter::clear('send-message:'.$message->user_id);
 
return $message;
}