Задать вопрос

Как правильно проверить истечение платной подписки пользователя?

Приветствую, друзья. В общем суть вопроса такова.
Пользователь приобретает возможность пользоваться сайтом, к примеру на 15 дней.
Как правильно реализовать это в базе? Кроной или как то иначе?
Я пока что остановился на таком решении:
Записываю дату активации и проплаты соответствующее поле в таблицу пользователей.
И после этого условие - если разница NOW() и этого поля больше 15 дней, то доступ к сайту закрыт.
Но почему то мне это решение кажется не самым рациональным.
Может кто-то реализовывал подобное. Поделитесь пожалуйста логикой.
Так же записываю следующие данные:
- Транзакцию(тоже с датой - для дальнейшего обращения к ней)
- Тип подписки(на 15 дней и 30 дней)
Заранее премного благодарен.
  • Вопрос задан
  • 196 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
archakov06
@archakov06
Frontend-разработчик (ReactJS)
1. Можно кроном.

2. Можно записывать активации и проверить период при каждом запросе. То есть, вы указали когда он купил доступ и каждый раз, когда юзер обновит сайт, скрипт проверяет, не прошло ли 15 дней с момента активации. Если уже прошло 15 дней, то очищаем в таблице активацию и оповещаем, что доступ закрыт. Смысл в том, что вам не надо крон юзать и пользовать сам и будет кроном)) Он при каждом обновлении страницы, будет запускать скрипт.

3. Можно указать дату окончанию в БД и каждый раз проверять, не наступила ли эта дата.

Это самые оптимальные решения.
Ответ написан
Комментировать
Wolfnsex
@Wolfnsex Куратор тега PHP
Если не хочешь быть первым - не вставай в очередь!
Всё зависит от того, как построена логика Вашего приложения или сайта. +1 запрос (а скорее даже не запрос, а доп. условие на что-то), вида:
SELECT IF ((NOW() + INTERVAL 15 DAY) > row_date_value, 'that', 'then') AS result

-- особых проблем не добавит, такие расчёты на уровне БД ведутся довольно быстро, к тому же, как можно заметить, в этом примере нет обращения к таблицам непосредственно, мы берём уже заранее готовое (полученное) значение.

Но, с другой стороны, контролировать логику работы на уровне БД, пожалуй не самое практичное решение. В 99% случаев, есть более правильные механизмы реализованные на уровне фреймворка, так же как например, авторизация. Вы же не проверяете можно ли пользователю создавать запись новостей на сайте, на уровне БД?

В частности, в зависимости от системы/фреймворка, подобная логика проверок и валидаций обычно встроена и оптимальным решением будет использовать именно её (как именно она устроена, можно посмотреть на примере модуля авторизации Вашей системы).

Если же вопрос стоит исключительно в критичность доступности данных, в частности, эти данные нужно получать "молниеносно", а дата до которой продлена подписка - лежит где-то глубоко в БД и постоянные проверки сильно нагружают файловую систему сервера - можно воспользоваться временными таблицами которые хранятся в памяти, или закэшировать эти данные Redis или Memcached и получать их оттуда максимально быстро с минимальной нагрузкой на сервер.

Если вопрос состоит в том, как лучше сверять даты на уровне "контроллера" (или чего-то ему аналогичного) - Вы можете перевести дату в число Unix-timestamp и сравнивать два числа, быстро и удобно.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы