我有一个表,存储需要发送的电子邮件。有一个cron脚本正在运行,它遍历该表,获取结果集并发送电子邮件。
这都很好。然而,有时cron可能会在一个接一个被调用两次(由用户干预)。
发生以下情况CRON1-获取要发送的电子邮件数组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:????
非常感谢您的帮助和见解
这个呢:
- 将
status
字段添加到EmailQueue
- 插入邮件发送时设置状态为
pending
- 检索
SELECT * EmailQueue WHERE status = 'pending'
时更新状态为 - 发送邮件时,如果结果为
successful
,可以删除 - 如果没有将该记录设置回
pending
,它将排队等待下一个cron任务
sending
的表