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