Метод consume
Метод consume класса RateLimiter
списывает токены из хранилища лимита.
Первым параметром передаётся количество токенов,
которое нужно списать. Метод возвращает объект
RateLimit, содержащий информацию о том,
принят ли запрос, сколько токенов осталось и
через сколько секунд можно повторить попытку.
Синтаксис
$limiter->consume(int $tokens = 1): RateLimit
Пример
Давайте создадим лимитер и списываем один токен:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\RateLimiter\RateLimiterFactory;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(RateLimiterFactory $anonymousApiLimiter): Response
{
$limiter = $anonymousApiLimiter->create('user_ip');
$limit = $limiter->consume(1);
if (false === $limit->isAccepted()) {
return new Response('Too many requests', 429);
}
return new Response('hello');
}
}
?>
Результат выполнения кода при первом запросе:
hello
Пример
Давайте выведем оставшееся количество токенов:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\RateLimiter\RateLimiterFactory;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(RateLimiterFactory $anonymousApiLimiter): Response
{
$limiter = $anonymousApiLimiter->create('user_ip');
$limit = $limiter->consume(2);
$accepted = $limit->isAccepted() ? 'accepted' : 'rejected';
$remaining = $limit->getRemainingTokens();
return new Response($accepted . ': ' . $remaining);
}
}
?>
Результат выполнения кода:
"accepted: 8"
Пример
Давайте получим время ожидания при превышении лимита:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\RateLimiter\RateLimiterFactory;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(RateLimiterFactory $anonymousApiLimiter): Response
{
$limiter = $anonymousApiLimiter->create('user_ip');
$limit = $limiter->consume(10);
if (false === $limit->isAccepted()) {
$retryAfter = $limit->getRetryAfter();
return new Response('Retry after: ' . $retryAfter->getTimestamp());
}
return new Response('hello');
}
}
?>
Результат выполнения кода при превышении лимита:
"Retry after: 1712345678"
Смотрите также
-
класс
RateLimiter,
который управляет ограничением скорости запросов -
метод
create,
который создаёт новый экземпляр лимитера -
метод
reset,
который сбрасывает счётчик лимита -
класс
RateLimit,
который хранит результат проверки лимита