优化迭代结果集php mysql与多实例


Optimizing Iterating over resultset php mysql with multi instances

我有一个表,存储需要发送的电子邮件。有一个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'
  • 时更新状态为sending 的表
  • 发送邮件时,如果结果为successful,可以删除
  • 如果没有将该记录设置回pending,它将排队等待下一个cron任务