通过Simultaneous Cron Jobs下载电子邮件附件 - 竞争条件

时间:2010-07-08 22:27:07

标签: php multithreading codeigniter cron

我需要一个cron作业来检查电子邮件帐户并下载某些附件。这个cron作业将每分钟运行一次。我的问题是,当第一个脚本正在下载电子邮件附件时,第二个(或第三个或第四个......)脚本将与之前执行的脚本一起运行。问题是我不确定阻止后续脚本尝试下载以前脚本已下载(或当前正在下载)的电子邮件附件的最佳方法是什么。

其他细节:

  • 使用CodeIgniter
  • 使用Zend Mail库访问电子邮件和下载附件
  • 电子邮件可能是POP3

我想知道我是否可以某种方式使用“message-id”标题。

1 个答案:

答案 0 :(得分:2)

您可以使用锁定文件阻止并发cron脚本运行。您可能不希望并发脚本下载附件,您将遇到令人讨厌的竞争条件。

像这样工作:

starter.sh

  • 检查锁文件是否存在,如果存在,立即退出。
  • 如果没有,则会创建一个锁定文件并启动main.php脚本。
  • 在main.php完成后,它会删除锁定文件。
  • 这样,如果main.php崩溃或抛出异常,锁定文件将被删除,并且可以在下一分钟重新启动。

main.php

  • 进行实际下载。

修改

我明白了。然后,您需要更复杂的设置。读取from,subject和datetime的单线程脚本,并将它们放在队列中(db表非常适合这种情况)。它应该像我上面解释的那样工作。其次,你有一个php进程池,它读取db表并根据表中的数据下载附件。

由于他们使用线程安全数据结构(数据库),因此可以在每行上设置下载/下载的标志。

他们只是在顶部使用sql select进行循环(选择前1个未下载/下载消息)。你需要一些东西来处理崩溃并重启php进程,但这就是它的主旨。