使用cron作业为每个用户安排具有可变时间的每日通知

时间:2014-01-23 08:22:03

标签: php mysql notifications cron

我有一个网站,每个用户都可以选择在他选择的时间收到每日电子邮件提醒(假设时区相同)。

因此,在他的个人资料中有一个输入框,其中包含“接收电子邮件提醒的时间”。

如何在CRON工作中实现这一目标?

我想过每分钟运行这样的东西:

SELECT `id`,`email` FROM `reg_users` WHERE `start_time` >= $time_now

问题是它会发送多封电子邮件。

也许,每次比赛都要在发送电子邮件后更新一个标志。

UPDATE reg_users SET sent_already = 1;

然后上面的查询将是

SELECT `id`,`email` FROM `reg_users` WHERE `start_time` >= $time_now AND `sent_already` = 0;

但是在一天结束时需要UPDATE所有记录到sent_already = 0并使用第二个CRON作业。看起来有点草率。

任何人都有更好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

让cron运行x分钟,运行类似。

SELECT `cols` FROM `Emails_Queue` WHERE `Timestamp` <= NOW() LIMIT 0,50

此外,您应该限制查询,以免被标记为垃圾邮件发送者更改50一次要发送的数量。我相信现在是DATETIME格式。

然后您发送了没有错误的电子邮件删除了带有某种ID的电子邮件(从选择中提取),这样您就可以删除正确的电子邮件。

DELETE FROM `Emails_Queue` WHERE `colid` = ?

插入问题。你可以查看类似的内容。

SELECT `cols` FROM `Emails_Queue` WHERE `User` = ? AND `Timestamp` = ?

然后如果没有返回结果。

或者您可以使用UserTimestamp之类的复合键并拥有ON UPDATE NO ACTION,但只有在您的数据库引擎支持密钥时才能使用。然后你可以做到以下几点。

INSERT INTO `Emails_Queue` (`cols`) VALUES (val)

或者你可以让cron动态创建它们。

SELECT `cols` FROM `Emails_Queue` WHERE `Not_Sent` = TRUE AND `Timestamp` <= NOW() LIMIT 0,50

然后发送电子邮件。

UPDATE `Emails_Queue` SET `Not_Sent` = FALSE WHERE `User` = ?

每周通过cron执行以下操作。

UPDATE `Emails_Queue` SET `Not_Sent` = TRUE WHERE `Not_Sent` = FALSE