Как ограничить максимальное количество запросов веб-сайта до 10 на пользователя в день, используя базу данных для записи количества запросов? - PullRequest
2 голосов
/ 16 июня 2011

У меня есть имя пользователя, и ему разрешено десять запросов в день.Каждый день запросы возвращаются к 0, а старые данные не нужны.

Каков наилучший способ сделать это?

Это способ, который приходит на ум, но я неуверен, что это лучший способ
(два поля, today_date, request_count):

  1. Запросить в БД дату последнего запроса и количество запросов.
  2. Получить результат и проверитьесли это было сегодня.
  3. Если сегодня, проверьте количество запросов, если меньше 10, обновите базу данных запросов до ++count.
  4. Если не сегодня, обновите базу данных с сегодняшней датой и count = 1.

Есть ли другой способ с меньшим количеством запросов к БД?

Ответы [ 4 ]

2 голосов
/ 16 июня 2011

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

Но что бы вы ни выбрали, оба решения очень похожи по производительности, размеру данных и времени / сложности разработки.

1 голос
/ 16 июня 2011

Чтобы сэкономить некоторые запросы к БД, определите

  1. максимально допустимое количество запросов в день.
  2. первый день, доступный для вашего приложения (смещение даты).

Затем добавьте поле requestcount в базу данных для пользователя.

При первом запросе получите счет из базы данных.

Счет всегда является номером дняумножается на максимум + 1 запросов в день плюс фактические запросы этого пользователя:

   day * (max + 1) + n

Так что, если по первому запросу количество в БД фактически превышает допустимое, блокируется.

В противном случае, если она ниже, чем база текущего дня, сбросьте базу текущего дня (в переменной PHP)

И подсчитайте.Сохраните это значение в БД.

Это одна операция чтения, и, если запрос все еще действителен, одна операция записи в БД на запрос.

Нет необходимости запускатьЗадача cron, чтобы убрать это.

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

1 голос
/ 16 июня 2011

Всего один столбец request_count. Затем запросите этот столбец и обновите его. Насколько я знаю, с помощью хранимых процедур это может быть возможно в одном запросе. Даже если нет, это будет только два. Затем создайте задание cron, которое вызывает скрипт, который сбрасывает столбец на 0 каждый день в 00:00.

0 голосов
/ 16 июня 2011

Вы должны принять во внимание, что каждый пользователь может находиться в другом часовом поясе, чем ваш сервер, поэтому вы не можете просто сохранить счет или трюк "день * макс".Попробуйте получить смещение по времени, и тогда начало дня пользователя может быть сохранено в вашей базе данных "квот".В mySQL это выглядело бы так:

`start_day`=ADDTIME(CURDATE()+INTERVAL 0 SECOND,'$offsetClientServer')

Затем просто посмотрите на это время при следующей проверке квоты.Все квоты можно проверить одним запросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...