我有一个存储需要发送的电子邮件的表。有一个运行的cron脚本迭代该表,获取结果集并发送电子邮件。
这一切都很好。但有时候cron可能会在一个接一个的后不久被调用(通过用户干预)。
发生以下情况 科雷 1-获取要发送的电子邮件数组 2-在结果集中迭代php并发送列表中的第一封电子邮件 3-成功发送后从表中删除电子邮件。
然而,在时间nr 1,cron由用户干预启动 有另一个提取和发送...所以电子邮件发送两次。
伪代码如下:
$results = query(Select * from EmailQueue); // could contain 2000-5000 records
foreach(results)
{
$res = DoSend();
if ($res = true) {removeSentItemFromQueue();} // only remove the email on successful send
}
防止它发送两次的最佳策略是什么,同时保持代码的流线化速度。
选项1:使sql只获得1条记录,并放入循环中? 选项2:交易? 选项3:获取记录,设置代码正在其上工作的信号量,以便下一个只获取非信号量记录。 选项4:??? 选项5:????
非常感谢您的帮助和见解。
答案 0 :(得分:0)
这个怎么样:
status
字段添加到EmailQueue
pending
SELECT * EmailQueue WHERE status = 'pending'
sending
successful
,则在发送电子邮件时可以删除pending
,它将排队等待下一个cron任务