محدود کردن نرخ
معرفی
لاراول شامل یک انتزاع محدود کننده نرخ است که در ارتباط با حافظه پنهان برنامه شما ، راهی آسان برای محدود کردن هر اقدامی در طول یک پنجره زمانی مشخص را فراهم میکند.
اگر علاقه مند به محدود کردن نرخ درخواست های 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;}