#Introducción
Laravel incluye una abstracción sencilla para la limitación de tasa que, junto con la caché de su aplicación, proporciona una forma fácil de limitar cualquier acción durante una ventana de tiempo especificada.
Si está interesado en limitar la tasa de las solicitudes HTTP entrantes, por favor consulte la documentación del middleware de limitación de tasa.
#Configuración de Caché
Normalmente, el limitador de tasa utiliza la caché predeterminada de su aplicación definida por la clave default dentro del archivo de configuración cache de su aplicación. Sin embargo, puede especificar qué driver de caché debe usar el limitador de tasa definiendo una clave limiter dentro del archivo de configuración cache de su aplicación:
'default' => 'memcached',
'limiter' => 'redis',
#Uso Básico
La fachada Illuminate\Support\Facades\RateLimiter puede usarse para interactuar con el limitador de tasa. El método más simple que ofrece el limitador de tasa es el método attempt, que limita la tasa de una callback dada durante un número determinado de segundos.
El método attempt devuelve false cuando la callback no tiene intentos restantes disponibles; de lo contrario, el método attempt devolverá el resultado de la callback o true. El primer argumento que acepta el método attempt es una "clave" del limitador de tasa, que puede ser cualquier cadena que usted elija y que represente la acción que se está limitando:
use Illuminate\Support\Facades\RateLimiter;
$executed = RateLimiter::attempt(
'send-message:'.$user->id,
$perMinute = 5,
function() {
// Enviar mensaje...
}
);
if (! $executed) {
return '¡Demasiados mensajes enviados!';
}
Si es necesario, puede proporcionar un cuarto argumento al método attempt, que es la "tasa de decaimiento", o el número de segundos hasta que los intentos disponibles se restablezcan. Por ejemplo, podemos modificar el ejemplo anterior para permitir cinco intentos cada dos minutos:
$executed = RateLimiter::attempt(
'send-message:'.$user->id,
$perTwoMinutes = 5,
function() {
// Enviar mensaje...
},
$decayRate = 120,
);
#Incrementar Intentos Manualmente
Si desea interactuar manualmente con el limitador de tasa, hay varios métodos disponibles. Por ejemplo, puede invocar el método tooManyAttempts para determinar si una clave dada del limitador de tasa ha excedido su número máximo de intentos permitidos por minuto:
use Illuminate\Support\Facades\RateLimiter;
if (RateLimiter::tooManyAttempts('send-message:'.$user->id, $perMinute = 5)) {
return '¡Demasiados intentos!';
}
RateLimiter::increment('send-message:'.$user->id);
// Enviar mensaje...
Alternativamente, puede usar el método remaining para obtener el número de intentos restantes para una clave dada. Si una clave tiene reintentos disponibles, puede invocar el método increment para aumentar el número total de intentos:
use Illuminate\Support\Facades\RateLimiter;
if (RateLimiter::remaining('send-message:'.$user->id, $perMinute = 5)) {
RateLimiter::increment('send-message:'.$user->id);
// Enviar mensaje...
}
Si desea incrementar el valor para una clave dada del limitador de tasa en más de uno, puede proporcionar la cantidad deseada al método increment:
RateLimiter::increment('send-message:'.$user->id, amount: 5);
#Determinar Disponibilidad del Limitador
Cuando una clave no tiene más intentos disponibles, el método availableIn devuelve el número de segundos restantes hasta que haya más intentos disponibles:
use Illuminate\Support\Facades\RateLimiter;
if (RateLimiter::tooManyAttempts('send-message:'.$user->id, $perMinute = 5)) {
$seconds = RateLimiter::availableIn('send-message:'.$user->id);
return 'Puede intentar de nuevo en '.$seconds.' segundos.';
}
RateLimiter::increment('send-message:'.$user->id);
// Enviar mensaje...
#Restablecer Intentos
Puede restablecer el número de intentos para una clave dada del limitador de tasa usando el método clear. Por ejemplo, puede restablecer el número de intentos cuando un mensaje dado es leído por el receptor:
use App\Models\Message;
use Illuminate\Support\Facades\RateLimiter;
/**
* Marcar el mensaje como leído.
*/
public function read(Message $message): Message
{
$message->markAsRead();
RateLimiter::clear('send-message:'.$message->user_id);
return $message;
}