Как установить ограничитель скорости в секунду в Laravel версии 8

#php #laravel #laravel-8 #rate-limiting

Вопрос:

Как установить ограничитель скорости в секунду в Laravel 8. Мне нужно установить ограничитель скорости в секунду, а не в минуту.

Ограничитель скорости (Laravel 8) — https://laravel.com/docs/8.x/routing#rate-limiting

Прямо сейчас я могу использовать ограничитель скорости Laravel в течение минут, часов и т. Д. Но я пытаюсь добиться ограничения скорости на секунду. Я хочу ограничить 25 запросов в секунду. (Экспортированный класс ограничения из «ПодсветкаКэшОграничение скоростиОграничение»)

Пожалуйста, проверьте следующий код, который я использовал

 RateLimiter::for('api', function (Request $request) {
        return [
            // Rate limiter based on Client IP Address
            Limit::perMinute(env('IP_ADDR_RATE_LIMITER_PER_MINUTE', 60))->by($request->ip())->response(function () {
                ....
            }),
            // Rate limiter based on API key/User
            Limit::perMinute(env('API_KEY_RATE_LIMITER_PER_MINUTE', 60))->by($request->input('key'))->response(function () {
                ...
            })
        ];
    });
 

Есть ли какой-нибудь способ ограничить скорость 25 запросов в секунду?

Примечание: также попытался добавить/изменить функции в IlluminateCacheRateLimitingLimit, где я попытался изменить функцию в минуту. заранее спасибо.

Комментарии:

1. Не знаю, почему вас понизили в голосовании. У меня та же проблема. Вы уже нашли решение?

2. Я также ищу то же самое решение. Я не убежден (проведя несколько тестов), что установка (желаемой скорости * 60) в качестве предела::perMinute будет делать то же самое, что и ограничение скорости в секунду. Вы нашли решение?

Ответ №1:

Можно настроить Laravel 8 RateLimitter так, чтобы он учитывал req/секунды

Вот пример, который вы ищете: https://learn2torials.com/thread/how-to-set-the-rate-limiter-for-per-second-in-laravel-version-8

Комментарии:

1. Ответ, указанный в ссылке, не работает

Ответ №2:

Вы можете переопределить класс IlluminateCacheRateLimitingLimit, чтобы разрешить атрибут $perSeconds типа float и добавить новую функцию perSeconds ().

 /**
     * Create a new rate limit using seconds as decay time.
     *
     * @param  int  $maxAttempts
     * @param  int  $decaySeconds
     * @return static
     */
    public static function perSeconds($decaySeconds, $maxAttempts)
    {
        return new static('', $maxAttempts, $decaySeconds/60.0);
    }

 

Комментарии:

1. Это, похоже, не работает, так как внутренняя функция, возвращаемая отсюда, принимает только целочисленный тип, а не тип с плавающей точкой. Я получаю тот же результат, что и при использовании ограничителя минутной скорости.