РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
834 of 1361 menu

Метод 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,
    который хранит результат проверки лимита
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить