Laravel, uygulamanızın önbelleğiyle birlikte kullanıldığında belirli bir zaman aralığında herhangi bir eylemi sınırlamanın kolay bir yolunu sağlayan, kullanımı kolay bir hız sınırlama soyutlaması içerir.
Önbellek Yapılandırması
Genellikle, oran sınırlayıcı, uygulamanızın önbellek yapılandırma dosyasındaki varsayılan anahtar tarafından tanımlandığı gibi varsayılan uygulama önbelleğinizi kullanır. Ancak, oran sınırlayıcının hangi önbellek sürücüsünü kullanması gerektiğini, uygulamanızın önbellek yapılandırma dosyasında bir sınırlayıcı anahtarı tanımlayarak belirtebilirsiniz:
'default' => env('CACHE_STORE', 'database'),
'limiter' => 'redis',Temel Kullanım IlluminateSupportFacadesRateLimiter face, hız sınırlayıcıyla etkileşim kurmak için kullanılabilir. Hız sınırlayıcının sunduğu en basit yöntem, belirli bir saniye sayısı için belirli bir geri aramayı hız sınırlayan deneme yöntemidir. Deneme yöntemi, geri aramanın kalan denemesi olmadığında false döndürür; aksi takdirde, deneme yöntemi geri aramanın sonucunu veya true döndürür. Deneme yöntemi tarafından kabul edilen ilk argüman, oran sınırlandırılmış eylemi temsil eden seçtiğiniz herhangi bir dize olabilen bir oran sınırlayıcı "anahtarı"dır:
use Illuminate\Support\Facades\RateLimiter;
$executed = RateLimiter::attempt(
'send-message:'.$user->id,
$perMinute = 5,
function() {
// Send message...
}
);
if (! $executed) {
return 'Too many messages sent!';
}Gerekirse, deneme yöntemine dördüncü bir argüman sağlayabilirsiniz, bu da "çürüme oranı" veya mevcut denemelerin sıfırlanmasına kadar geçen saniye sayısıdır. Örneğin, yukarıdaki örneği her iki dakikada beş denemeye izin verecek şekilde değiştirebiliriz:
$executed = RateLimiter::attempt(
'send-message:'.$user->id,
$perTwoMinutes = 5,
function() {
// Send message...
},
$decayRate = 120,
);Denemeleri Manuel Olarak Artırma
Hız sınırlayıcıyla manuel olarak etkileşim kurmak isterseniz, çeşitli diğer yöntemler mevcuttur. Örneğin, belirli bir hız sınırlayıcı anahtarının dakika başına izin verilen maksimum deneme sayısını aşıp aşmadığını belirlemek için tooManyAttempts yöntemini çağırabilirsiniz:
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...Alternatif olarak, belirli bir anahtar için kalan deneme sayısını almak için kalan yöntemini kullanabilirsiniz. Belirli bir anahtar için kalan yeniden denemeler varsa, toplam deneme sayısını artırmak için increment yöntemini çağırabilirsiniz:
use Illuminate\Support\Facades\RateLimiter;
if (RateLimiter::remaining('send-message:'.$user->id, $perMinute = 5)) {
RateLimiter::increment('send-message:'.$user->id);
// Send message...
}Belirli bir oran sınırlayıcı anahtarının değerini birden fazla artırmak isterseniz, artırma yöntemine istediğiniz miktarı girebilirsiniz:
RateLimiter::increment('send-message:'.$user->id, amount: 5);Sınırlayıcı Kullanılabilirliğini Belirleme
Bir anahtar için daha fazla deneme hakkı kalmadığında availableIn yöntemi, daha fazla denemenin mümkün olacağı zamana kadar kalan saniye sayısını döndürür:
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...Temizleme Girişimleri
Belirli bir hız sınırlayıcı anahtarı için deneme sayısını clear yöntemini kullanarak sıfırlayabilirsiniz. Örneğin, belirli bir mesaj alıcı tarafından okunduğunda deneme sayısını sıfırlayabilirsiniz:
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;
}