使用多个实例优化对结果集php mysql的迭代

时间:2014-08-08 20:53:34

标签: php optimization mysqli

我有一个存储需要发送的电子邮件的表。有一个运行的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:????

非常感谢您的帮助和见解。

1 个答案:

答案 0 :(得分:0)

这个怎么样:

  • status字段添加到EmailQueue
  • 插入要发送的电子邮件时,将状态设置为pending
  • 检索SELECT * EmailQueue WHERE status = 'pending'
  • 如果找到,请更新状态为sending
  • 的表格
  • 如果结果为successful,则在发送电子邮件时可以删除
  • 如果没有将该记录设置回pending,它将排队等待下一个cron任务