محدود کردن نرخ
معرفی
لاراول شامل یک انتزاع محدود کننده نرخ است که در ارتباط با حافظه نهان برنامه شما ، راهی آسان برای محدود کردن هر اقدامی در طول یک پنجره زمانی مشخص ارائه میکند.
اگر علاقه مند به محدود کردن نرخ درخواست های HTTP ورودی هستید، لطفاً به اسناد میان افزار محدود کننده نرخ مراجعه کنید .
پیکربندی کش
به طور معمول، محدود کننده نرخ از حافظه پنهان برنامه پیش فرض شما همانطور که توسط
default
کلید داخل فایل پیکربندی برنامه شما تعریف شده است، استفاده می کند
cache
. با این حال، میتوانید با تعریف
limiter
کلیدی در فایل پیکربندی برنامه،
تعیین کنید که محدودکننده نرخ از کدام درایور کش استفاده کند
cache
:
'default' => env('CACHE_STORE', 'database'), '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!';}
در صورت لزوم، میتوانید آرگومان چهارمی را برای
attempt
روش ارائه دهید، که عبارت است از «نرخ فروپاشی» یا تعداد ثانیهها تا زمانی که تلاشهای موجود بازنشانی شوند. به عنوان مثال، میتوانیم مثال بالا را طوری تغییر دهیم که هر دو دقیقه پنج بار انجام شود:
$executed = RateLimiter::attempt( 'send-message:'.$user->id, $perTwoMinutes = 5, function() { // Send message... }, $decayRate = 120,);
افزایش دستی تلاش ها
اگر میخواهید به صورت دستی با محدودکننده نرخ تعامل داشته باشید، روشهای متنوع دیگری در دسترس هستند. به عنوان مثال، میتوانید این
tooManyAttempts
روش را برای تعیین اینکه آیا یک کلید محدودکننده نرخ داده شده از حداکثر تعداد تلاشهای مجاز در دقیقه فراتر رفته است استفاده کنید:
use Illuminate\Support\Facades\RateLimiter; if (RateLimiter::tooManyAttempts('send-message:'.$user->id, $perMinute = 5)) { return 'Too many attempts!';} RateLimiter::increment('send-message:'.$user->id); // Send message...
همچنین، میتوانید از
remaining
روشی برای بازیابی تعداد تلاشهای باقیمانده برای یک کلید معین استفاده کنید. اگر برای یک کلید مشخص، تلاشهای مجدد باقی مانده است، میتوانید از
increment
روش برای افزایش تعداد کل تلاشها استفاده کنید:
use Illuminate\Support\Facades\RateLimiter; if (RateLimiter::remaining('send-message:'.$user->id, $perMinute = 5)) { RateLimiter::increment('send-message:'.$user->id); // Send message...}
اگر می خواهید مقدار یک کلید محدود کننده نرخ معین را بیش از یک افزایش دهید، می توانید مقدار مورد نظر را به روش ارائه دهید
increment
:
RateLimiter::increment('send-message:'.$user->id, amount: 5);
تعیین در دسترس بودن محدود
هنگامی که هیچ تلاش دیگری برای یک کلید باقی نمانده است،
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.';} RateLimiter::increment('send-message:'.$user->id); // Send message...
پاکسازی تلاش ها
میتوانید تعداد تلاشها را برای یک کلید محدودکننده نرخ معین با استفاده از
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;}