Saltar contenido

Limitador de Uso

Introducción

Laravel incluye una abstracción de limitación de tasa uso fácil de usar que, en conjunción con la cache de tu aplicación, proporciona una forma sencilla de limitar cualquier acción durante una ventana de tiempo especificada.

Nota
Si estás interesado en limitar la tasan de uso de peticiones HTTP entrantes, por favor consulta la documentación del middleware de limitacion.

Configuración de la Cache

Normalmente, el limitador de tasa de uso utiliza la cache por defecto de su aplicación, definida por la clave default dentro del archivo de configuración de cache de su aplicación. Sin embargo, puede especificar qué controlador de cache debe utilizar el limitador definiendo una clave llamada limiter en el archivo de configuración de cache de su aplicación:

'default' => 'memcached',
 
'limiter' => 'redis',

Uso Básico

La facade Illuminate\Support\Facades\RateLimiter puede utilizarse para interactuar con el limitador. El método más sencillo ofrecido por el limitador es el método attempt, que limita el número de veces que un callback dado es ejecutado durante un número determinado de segundos.

El método attempt devuelve false cuando a la llamada de retorno no le quedan intentos disponibles; en caso contrario, el método attempt devolverá el resultado de la llamada de retorno o true. El primer argumento aceptado por el método attempt es una "clave" de limitación, que puede ser cualquier cadena de su elección que represente la acción que se está limitando:

use Illuminate\Support\Facades\RateLimiter;
 
$executed = RateLimiter::attempt(
'send-message:'.$user->id,
$perMinute = 5,
function() {
// Send message...
}
);
 
if (! $executed) {
return 'Too many messages sent!';
}

Incremento manual de intentos

Si desea interactuar manualmente con el limitador, dispone de otros métodos. Por ejemplo, puede invocar el método tooManyAttempts para determinar si una clave de limitación dada 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 'Too many attempts!';
}

De manera alternativa, puede utilizar el método remaining para recuperar el número de intentos restantes de una clave dada. Si una clave tiene reintentos restantes, puede invocar el método hit para incrementar el número de intentos totales:

use Illuminate\Support\Facades\RateLimiter;
 
if (RateLimiter::remaining('send-message:'.$user->id, $perMinute = 5)) {
RateLimiter::hit('send-message:'.$user->id);
 
// Send message...
}

Determinación de la disponibilidad del limitador

Cuando a una clave no le quedan más intentos, el método availableIn devuelve el número de segundos que quedan 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 'You may try again in '.$seconds.' seconds.';
}

Restablecer Intentos

Puede restablecer el número de intentos para una clave determinada utilizando el método clear. Por ejemplo, puede restablecer el número de intentos cuando el receptor lea un mensaje determinado:

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;
}