Метод getRetryAfter
Метод getRetryAfter принадлежит классу RateLimit
и возвращает количество секунд, которое нужно подождать
до следующей попытки выполнить действие, если лимит был
исчерпан. Если запрос ещё не отклонён, метод вернёт null.
Параметров метод не принимает.
Метод удобно использовать вместе с isAccepted:
сначала проверяем, принят ли запрос, а затем при отказе
узнаём, сколько секунд ждать до повторной попытки.
Синтаксис
public function getRetryAfter(): ?int
Пример
Давайте создадим лимитер и попробуем выполнить действие, превысив лимит. В ответ выведем количество секунд ожидания:
<?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 RateLimitController extends AbstractController
{
#[Route('/limit', name: 'rate_limit')]
public function index(RateLimiterFactory $anonymousApiLimiter): Response
{
$limiter = $anonymousApiLimiter->create('user');
$limit = $limiter->consume(1);
if (!$limit->isAccepted()) {
$retryAfter = $limit->getRetryAfter();
return new Response('Retry after: ' . $retryAfter . ' seconds');
}
return new Response('hello');
}
}
?>
Результат выполнения кода при исчерпанном лимите:
"Retry after: 60 seconds"
Результат выполнения кода, если лимит не исчерпан:
"hello"
Пример
Давайте выведем заголовок Retry-After, который
сообщает клиенту время ожидания в формате HTTP:
<?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 RateLimitController extends AbstractController
{
#[Route('/api/data', name: 'api_data')]
public function data(RateLimiterFactory $anonymousApiLimiter): Response
{
$limiter = $anonymousApiLimiter->create('user');
$limit = $limiter->consume(1);
if (!$limit->isAccepted()) {
$retryAfter = $limit->getRetryAfter();
return new Response('Too Many Requests', 429, [
'Retry-After' => $retryAfter,
]);
}
return new Response('abcde');
}
}
?>
Результат выполнения кода при исчерпанном лимите:
"Too Many Requests"
Смотрите также
-
класс
RateLimit,
который описывает результат проверки лимита -
метод
isAccepted,
который проверяет, принят ли запрос -
метод
getRemainingTokens,
который возвращает количество оставшихся токенов -
класс
RateLimiter,
который управляет ограничением запросов