Действие по наступлению определенного времени
Действие по наступлению определенного времени
Всем привет.
Есть скрипт, который продает товары, но не постоянно, а до какого-то момента (например, до 14:05 сегодняшнего дня по серверному времени).
Нужно, чтобы в фоновом режиме вызывалась определенная функция после того, как это время наступило.
Конечно, самый просто вариант - это Крон, который с интервалом в минуту проверяет товары, время действия которых закончилось и деактивирует их сам, а можно, чтобы юзер это делал, когда открывает страничку товара, но эти варианты не совсем подходят.
Возможно (а я уверен, что это так), существует более изящное решение?
В технологиях на ограничен, будет VPS.
Спасибо.
Есть скрипт, который продает товары, но не постоянно, а до какого-то момента (например, до 14:05 сегодняшнего дня по серверному времени).
Нужно, чтобы в фоновом режиме вызывалась определенная функция после того, как это время наступило.
Конечно, самый просто вариант - это Крон, который с интервалом в минуту проверяет товары, время действия которых закончилось и деактивирует их сам, а можно, чтобы юзер это делал, когда открывает страничку товара, но эти варианты не совсем подходят.
Возможно (а я уверен, что это так), существует более изящное решение?
В технологиях на ограничен, будет VPS.
Спасибо.
Re: Действие по наступлению определенного времени
чем крон не изящен?
Re: Действие по наступлению определенного времени
почему в коде не проверять бизнес-требование? вы что кроном собираетесь статус менять?
Re: Действие по наступлению определенного времени
Код что-то должно вызвать. Если не юзер в браузере, то что? Нужно что-то типа коллбэка по наступлении определенного времени.zelenin писал(а):почему в коде не проверять бизнес-требование? вы что кроном собираетесь статус менять?
Если Крон - единственное решение, то ок.
Спросить-то можно.
Re: Действие по наступлению определенного времени
я не пойму, что вы усложняете? если время 14:05 настало, выбираете из базы только те товары которые можно показывать на фронте. Так же делаете проверку в самом товаре, чтобы нельзя было его купить, если страницу с товаром открыли например в 14:03. Зачем тут крон? это неверный подход.theorist писал(а):Код что-то должно вызвать. Если не юзер в браузере, то что? Нужно что-то типа коллбэка по наступлении определенного времени.zelenin писал(а):почему в коде не проверять бизнес-требование? вы что кроном собираетесь статус менять?
Если Крон - единственное решение, то ок.
Спросить-то можно.
Re: Действие по наступлению определенного времени
Возможно, я не совсем верно описал задачу.zelenin писал(а):я не пойму, что вы усложняете? если время 14:05 настало, выбираете из базы только те товары которые можно показывать на фронте. Так же делаете проверку в самом товаре, чтобы нельзя было его купить, если страницу с товаром открыли например в 14:03. Зачем тут крон? это неверный подход.theorist писал(а):Код что-то должно вызвать. Если не юзер в браузере, то что? Нужно что-то типа коллбэка по наступлении определенного времени.zelenin писал(а):почему в коде не проверять бизнес-требование? вы что кроном собираетесь статус менять?
Если Крон - единственное решение, то ок.
Спросить-то можно.
Условно - как только время действия товара закончилось, я должен юзерам, попытавшимся его купить, начислить бонус. Если бы стояла задача просто не показывать на сайте, то я бы не просил советов, а так я должен вызвать функцию, у которой свое назначение и своя бизнес-логика относительно этих товаров.
Re: Действие по наступлению определенного времени
тогда все верно - действие товара закончилось, кроном начисляем бонусы.
Re: Действие по наступлению определенного времени
Кроном нельзя ведь конкретное время назначить? Там только интервалы?zelenin писал(а):тогда все верно - действие товара закончилось, кроном начисляем бонусы.
Или есть способ после сохранения товара запихнуть время его окончания в crontab?
Есть какой-нить best practice относительно моей задачи?
Последний раз редактировалось theorist 2016.06.07, 14:24, всего редактировалось 1 раз.
Re: Действие по наступлению определенного времени
время можно. если у вас даты разные и постоянно крон вручную редактировать неудобно, я бы рассмотрел очереди задач.
Re: Действие по наступлению определенного времени
Да, даты разные.zelenin писал(а):время можно. если у вас даты разные и постоянно крон вручную редактировать неудобно, я бы рассмотрел очереди задач.
Я так понимаю, в сервер очереди задач я могу поставить задачу типа "set_bonuses" и передать id-шник товара + указать время выполнения?
Re: Действие по наступлению определенного времени
нет, в классике вы по наступлению какого-то триггера (сохранение товара) отправляете в очередь задачу setBonuses. Очередь кидает задачу в воркер, который выполняет задачу. Все это в риалтайм. Задержки какие-то можно самому добавить в своей реализации.theorist писал(а):Да, даты разные.zelenin писал(а):время можно. если у вас даты разные и постоянно крон вручную редактировать неудобно, я бы рассмотрел очереди задач.
Я так понимаю, в сервер очереди задач я могу поставить задачу типа "set_bonuses" и передать id-шник товара + указать время выполнения?
Re: Действие по наступлению определенного времени
Спасибо, что вы откликаетесь на мои сообщения, но я, все же, не полностью понимаю.
Опишу цепочку действий.
1. Я создаю товар и ставлю время окончания, например, сегодня в полночь;
2. Юзеры наколбасили на него предзаказов;
3. Ровно в полночь я этим юзерам начислил бонус.
Триггер выкинется один раз при создании товара, но как я кину задачу в очередь? Ведь мне не нужно, чтобы она сейчас выполнилась. Нужно именно в полночь, как только срок действий закончился.
Юзеры могут в это время не открывать товар (так бы можно было инициировать отправку таска в очередь в этот момент, если время вышло).
Опишу цепочку действий.
1. Я создаю товар и ставлю время окончания, например, сегодня в полночь;
2. Юзеры наколбасили на него предзаказов;
3. Ровно в полночь я этим юзерам начислил бонус.
Триггер выкинется один раз при создании товара, но как я кину задачу в очередь? Ведь мне не нужно, чтобы она сейчас выполнилась. Нужно именно в полночь, как только срок действий закончился.
Юзеры могут в это время не открывать товар (так бы можно было инициировать отправку таска в очередь в этот момент, если время вышло).
Re: Действие по наступлению определенного времени
> Ровно в полночь я этим юзерам начислил бонус.
Ну раз один раз ровно в полночь, то просто поставить cron на полночь. А то все подумали, что Вам каждую минуту надо их проверять.
Ну раз один раз ровно в полночь, то просто поставить cron на полночь. А то все подумали, что Вам каждую минуту надо их проверять.
Последний раз редактировалось ElisDN 2016.06.07, 14:44, всего редактировалось 1 раз.
Re: Действие по наступлению определенного времени
Это для простоты примера. Может срок действия товара закончиться завтра в 14:06.ElisDN писал(а):> Ровно в полночь я этим юзерам начислил бонус.
Ну раз один раз ровно в полночь, то просто cron на полночь.
Re: Действие по наступлению определенного времени
итак: у вас есть товары с датой окончания. Каждые 10 минут вы выбираете все товары, которые закончили свое действие в последние 10 минут. На каждый товар создаете задачу SetBonuses($productId); и отправляете в очередь (можно и без очереди, но команда будет выполняться долго при росте покупателей и товаров - предвосхитите это). Очередь почти моментально (зависит от кол-ва задач в очереди) кинет все это в воркеры, которые произведут расчет.
Re: Действие по наступлению определенного времени
Спасибо, выглядит неплохо.zelenin писал(а):итак: у вас есть товары с датой окончания. Каждые 10 минут вы выбираете все товары, которые закончили свое действие в последние 10 минут. На каждый товар создаете задачу SetBonuses($productId); и отправляете в очередь (можно и без очереди, но команда будет выполняться долго при росте покупателей и товаров - предвосхитите это). Очередь почти моментально (зависит от кол-ва задач в очереди) кинет все это в воркеры, которые произведут расчет.
Хотелось, конечно, чтобы срабатывал какой-то коллбэк, но есть подозрения, что моя задача не решается в тот способ, который я себе придумал.
Мужики, спасибо всем, как минимум одно решение есть, благодаря вам.
Re: Действие по наступлению определенного времени
очередь задач - это собственно обычный паттерн, с которым вы часто встречались на разных сервисах. Тот же самый интернет у вас никогда не отрубается в 0:00, а всегда в 2-3 часа ночи)theorist писал(а):Спасибо, выглядит неплохо.
Хотелось, конечно, чтобы срабатывал какой-то коллбэк, но есть подозрения, что моя задача не решается в тот способ, который я себе придумал.
Re: Действие по наступлению определенного времени
Никогда раньше об этом не задумывался.zelenin писал(а):очередь задач - это собственно обычный паттерн, с которым вы часто встречались на разных сервисах. Тот же самый интернет у вас никогда не отрубается в 0:00, а всегда в 2-3 часа ночи)theorist писал(а):Спасибо, выглядит неплохо.
Хотелось, конечно, чтобы срабатывал какой-то коллбэк, но есть подозрения, что моя задача не решается в тот способ, который я себе придумал.