@good_beginer

Как после «10» вызовов function write() в сек, блокировать её на «10мин»?

Нужна идея для реализации... Не обязательно писать код
public function write()
    {
        if (!$this->logged_in || empty($_POST["text"])) {
            return null;
        }

        $text = substr($_POST["text"], 0, 50);
        $textEscaped = htmlentities($text);

        if (!empty($text)) {
            $this->Messenger_model->add_message($this->$username, $textEscaped);
        }

        return null;
    }


/*js
$.post("/write", {
           username: inputuser;
            text: InputString;
        });
  • Вопрос задан
  • 132 просмотра
Решения вопроса 3
@bk_maestro
Считать итерации функции, а при достижения ограничения запускать setTimeout?
Ответ написан
@good_beginer Автор вопроса
Дошло...
(кому интересно) Запусаю 2 итерации, 1 для функции и 1 на время которая каждую 1 сек обнуляется и каждую 1се эти 2 значени сравниваются :D
Ответ написан
Комментировать
@dtBlack
Примерный код для ограничения по пользователю на сервере:
На стороне браузера примерно то же самое но использовать куки
//Проверяем наличие блокировки и время с ее выставления
        //В $_SESSION['blocked-write'] храним время выставления блокировки
        $time = time();
        if (isset($_SESSION['blocked-write']) && $_SESSION['blocked-write'] > 0){
            if (($time - $_SESSION['blocked-write'] <= 600)){
                return null;
            }else{
                $_SESSION['blocked-write'] = 0;
            }
        }
        //$_SESSION['time-write'] - храним секунду для которой считаем количество
        //$_SESSION['count-write'] - количество срабатываний
        //Проверили какую секунду считаем
        if ($_SESSION['time-write'] == $time){
            $_SESSION['count-write']++;
            if ($_SESSION['count-write'] >= 10){
                $_SESSION['blocked-write'] = $time;
            }
        }else{
            $_SESSION['time-write'] = $time;
            $_SESSION['count-write'] = 1;
        }


PS: Вместо сессии можно использовать любое хранилище, хоть файл)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
sergiks
@sergiks Куратор тега PHP
♬♬
На стороне сервера – надо сохранять массив времен последних вызовов функции. При очередном вызове смотреть число времен в этом массиве и время самого раннего. Дописывать в конец текущее время и удалять записи старше 1 секунды.

В качестве хранилища можно использовать Redis или другое хранилище в памяти.

Если квота распространяется на каждого юзера в отдельности - хранить для каждого отдельно. В качестве ключа использовать в т.ч. user_id.

На клиенте похожий принцип: хранить массив времен вызовов и проверять число и время самого раннего при каждом.
Ответ написан
Комментировать
Fragster
@Fragster
помогло? отметь решением!
Для клиента есть lodash.debounce, для сервера на ноде+экспресс есть express-rate-limit
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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