@Alex2412729
Начинающий кодер

Ограничение выполнения функции, как сделать?

Здравствуйте есть приложение нужно сделать чтоб каждую функцию можно было выполнить через 3 секунды после последнего выполнения. Голову ломаю Carbon не могу понять а throttle только в минутах. Как реализовать подобное?
Вот пример функции
public function readNotifications() {
        if(Auth::guest()) return '-1';
        foreach(Notification::where('user_id', Auth::user()->id)->where('read_status', 0)->get() as $notification) {
            $notification->read_status = 1;
            $notification->save();
        }
        return '1';
    }
  • Вопрос задан
  • 117 просмотров
Решения вопроса 1
pxz
@pxz
✔ Совет: Вам помогли? Отметьте ответы решением.
Используйте класс `Illuminate\Cache\RateLimiter`.

$limiter = app()->make(Illuminate\Cache\RateLimiter::class); // Или завозите через DI

$limiterKey = request()->ip() . '_readNotifications';  // Какой-то ключ, по которому будет вестись счётчик

$decayIntervalInSeconds = 60; // Время, за которое считается счётчик, секунды
$limiterThreshold = 2; // Кол-во событий

// В данном случае 2 события в 60 сек.

// Проверяем счётчик
if ($this->limiter->tooManyAttempts($limiterKey, $limiterThreshold)) {
    throw new TooManyRequestsHttpException($decayIntervalInSeconds);
}

// Добавляем попытку
$this->limiter->hit($limiterKey, $decayIntervalInSeconds);

// ...  Делаем что-то


Лучше в какой-то метод обернуть или в сервис вынести.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
glaphire
@glaphire Куратор тега PHP
PHP developer
Тут в доке throttle по идее в секундах указан
https://laravel.com/docs/7.x/middleware#middleware...
И тут в issue описан хак, как сделать секунды
https://github.com/GrahamCampbell/Laravel-Throttle...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы