Subotinn
@Subotinn

Как организовать логику отправки писем по расписанию?

Здравствуйте.
Есть таблица со следующей структурой и записи имеющие следующий вид:
id 1
user_id 5
start_time 08:00:00
finish_time 18:00:00
interval 10

Интервал это количество минут, через которое должна выполнятся задача. В моём случае, это отправка письма, каждые 10 минут в рабочее время, с 8 часов, до 18 часов.

У каждого юзера, могут теоретически быть разное время и разный интервал.
Я столкнулся с трудностью. Скрипт который будет запускаться каждую минуту. Должен как-то выбрать всех юзеров, у которых есть отправка в данную минуту. То есть в нашем примере. Скрипт должен сработать для нашего пользователя в 8-00, в 8-10 и так далее.

Может кто сталкивался с данной задачей? И может посоветовать?
Я уже думал, что может хранение интервалов в таком виде, усложняет задачу. И лучше хранить это прям таки значениями:
8:00
8:10
...
  • Вопрос задан
  • 2355 просмотров
Решения вопроса 1
KorsaR-ZN
@KorsaR-ZN
У Вас же есть для этого все данные, совсем обленились думать?))

Зная, что Вас скрипт запускается каждую минуту, а в нем:
  1. Получайте текущие время (nowTime)
  2. Проверяем nowTime <= finish_time, если да, то продолжаем, иначе выходим из скрипта
  3. Вычисляем разницу между nowTime и start_time в минутах - diff
  4. Если diff % interval == 0, то отправляем сообщение, иначе нет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Shahelm
Вы не можете написать запрос вхождение одного интервала времени в другой?
Если так то гугл в помощь: sql вхождение даты в интервал
Или вы не можете реализовать скрипт который каждую минуту запускается?
Если так то гугл в помощь : cron
Ответ написан
@iliyaisd
Используйте cron. Логика расписаний в нём позволяет задать периоды, частоты и времена любой сложности.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Просто добавьте поле с указанием времени следующей отправки, скажем `next_time` TIME.
Выборка записей для отправки:
SELECT `id` 
    FROM `table` 
    WHERE CURTIME() BETWEEN `start_time` AND `finish_time` 
        AND `next_time` < $current_time;

Получая список заданий одновременно формируем его для запроса:
UPDATE `table` SET `next_time` = `next_time` + `interval`*60 
    WHERE `id` IN ({$task_list});
UPDATE `table` SET `next_time` = `start_time` 
    WHERE `next_time` > `finish_time`;
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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