我有一个网站,每个用户都可以选择在他选择的时间接收每日电子邮件提醒(为简单起见,假设相同时区)。
因此,他的个人资料中有一个输入框,其中包含“一天中接收电子邮件提醒的时间”。
如何在 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;
但随后需要在一天结束时使用第二个 CRON 作业UPDATE
将所有记录更新为sent_already = 0
。看起来有点草率。
谁有更好的解决方案?
最佳答案
让 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` = ?
如果没有返回结果。
或者您可以有一个带有 User
AND Timestamp
之类的复合键,并有一个 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
关于php - 使用 cron 作业为每个用户安排可变时间的每日通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21302865/