Добрый день, как можно реализовать систему премиум аккаунта на сайте? Например пользователь покупает его, в базу данных заносятся часы аккаунта, ну на сколько его купили.
Использую workerman, ломаю голову не знаю как сделать почасовую проверку корректную.
UPD:
Думаю на событие onworkerstart повесить таймер и каждые 60 секунд проверять даты и находить часы, правильно будет так? Меня терзают сомнения по поводу на какое событие воркера это вешать? Onconnect, onworkerstart?
Вместо того чтобы делать почасовую проверку - просто записывай время покупки, и время действия премиума.
А когда чел делает запрос какой-нибудь штуки, которая требует премиум - проверяй, не истекло ли время.
Можно ещё кэшировать результат в какой-нибудь другой базе, чтобы не вычислять постоянно, - в том же редисе, например.
luckyjenro0, ну так точно также же можно.
Вытаскиваешь из бд запись о купленном премиуме, к дате покупки прибавляешь время, сколько он должен действовать, и вычитаешь из получившейся даты текущее время.
Василий Банников, так а как мне сделать это в воркермене? Вопрос в этом, на какой эвент это вешать? Когда делать проверку? Таймер делать или что? Если таймер проверки то с каким интервалом? Каждые 60 секунд или 10?
luckyjenro0, никакой таймер не нужен. Это же http-апишка, верно?
Ну так и делай проверку при каждом запросе.
Если хочешь, чтобы в реальном времени обновлялось значение у клиента - ну добавь ещё таймер на такое время, которое тебя устроит.
edward_freedom, эм а проверять сколько времени прошло, если ты до сих пор не допкр объясняю, в личном кабинете отображается сколько часов осталось до конца премиум аккаунта, какая конченая дата, что ты несешь?
luckyjenro0, Поясни я купил час. Я могу расходовать 5 минут сегодня, 10 завтра и т.д.
Или как считает edward_freedom Оплата поступила в 12:30 в 13-30 премиум кончиться. Тоесть оплаченный час должен быть потрачен за один раз, не используемый остаток сгорает.
Олег, ты купил премиум на 12 часов, у тебя через 12 часов он снимется, и каждый час в бд обновляется оставшееся количество часов, не важно зашёл ты на сайт или нет.
ты должен сделать демона, который будет при изменениях в базе вычислять, когда будет ближайшая дата события, после исполнения кода на события которые долждны были исполниться к этому моменту, вычисляешь снова следующее
luckyjenro0, ты купил премиум на 10 часов в 13:37, в БД пишем, что премиум активен до 23:37.
И всё, никаких таймеров, ежечасных пересчетов и прочей фигни.
Просто проверяете кончился ли премиум сравнивая текущее время с временем окончания.
Если надо отобразить сколько осталось left = dateEnd - now()
Stalker_RED, у меня щас так, повторю - пишет просто дату окончания, а мне надо что бы сайт через сокеты сам все мониторить по кд и почасово изменял все, и менял в бд кол-во часов.
Олег, у меня страница и весь сайт на запросах к сокету, без перезагрузок, пользователь будет на сайте 6 часов сидеть, зайдет в личный кабинет в у ничего не поменялось
luckyjenro0,
то что показывается пользователю это отдельная независимая задача.
Для бизнес логики важно, чтобы премиум апи срезалось.
При отрисовке сайта . Запрашиваешь когда кончиться. javascript переменная принимает значение один раз.
От нее по таймеру раз в минуту считаешь остаток. Зачем ее дергать с бека.
Ну перепишите downcount.js так чтобы он принимал не остаток, а во сколько конец.
luckyjenro0, если у тебя сокет, то тем более постоянно обновлять премиум не надо, при первом запросе получил лицензию с бд и больше запросов на лицензию не отправляешь. Если пользователь докупил лицензию, то по сокету отправляй уведомление об оплате лицензии