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

标签 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;

但随后需要在一天结束时使用第二个 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/

相关文章:

javascript - 使用小书签中的通知 API

php - 拉YouTube观看次数

php - Laravel 5 中的 fatal error

php - HTACCESS 404错误无法正常工作

MySQL 仅限日期时间到月份

ios - 如何在应用程序委托(delegate)之外注册本地通知?

php - 在 PHP 和 MySQL 中首先显示以最高价格订购的记录

php - 禁用购物车输入过滤的 Magento 核心修改的效果?

mysql - 按 AVG(rating) 排序

android - 从通知打开对话框