Класс RateLimit
Класс RateLimit является частью компонента RateLimiter и представляет собой объект-результат, возвращаемый методом consume класса RateLimiter. Этот объект содержит информацию о том, был ли принят запрос, сколько токенов осталось в корзине и через сколько секунд лимит будет сброшен. Класс не имеет публичного конструктора - экземпляры создаются автоматически внутри RateLimiter. Параметры доступны через методы isAccepted, getRemainingTokens и getRetryAfter.
Синтаксис
$rateLimit = $limiter->consume(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\RateLimiter\Storage\InMemoryStorage;
use Symfony\Component\RateLimiter\Policy\TokenBucketLimiter;
class RateLimitController extends AbstractController
{
public function index(): Response
{
$storage = new InMemoryStorage();
$limiter = new TokenBucketLimiter('api', 10, new \DateInterval('PT1M'), $storage);
$rateLimit = $limiter->consume(1);
echo $rateLimit->getRemainingTokens();
return new Response();
}
}
?>
Результат выполнения кода:
9
Пример
Давайте проверим, принят ли запрос, и выведем время до сброса лимита:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\RateLimiter\Policy\TokenBucketLimiter;
use Symfony\Component\RateLimiter\Storage\InMemoryStorage;
class RateLimitController extends AbstractController
{
public function index(): Response
{
$storage = new InMemoryStorage();
$limiter = new TokenBucketLimiter('api', 2, new \DateInterval('PT1M'), $storage);
$limiter->consume(1);
$limiter->consume(1);
$rateLimit = $limiter->consume(1);
if (!$rateLimit->isAccepted()) {
echo 'retry after: ' . $rateLimit->getRetryAfter()->getTimestamp();
}
return new Response();
}
}
?>
Результат выполнения кода:
"retry after: 1712345678"
Смотрите также
-
класс
RateLimiter,
который управляет лимитами запросов -
метод
consume,
который расходует токены и возвращает RateLimit -
метод
isAccepted,
который проверяет, принят ли запрос -
метод
getRemainingTokens,
который возвращает количество оставшихся токенов