Php 通过模拟Cron作业下载电子邮件附件--竞争条件

Php 通过模拟Cron作业下载电子邮件附件--竞争条件,php,multithreading,codeigniter,cron,Php,Multithreading,Codeigniter,Cron,我需要一个cron作业来检查电子邮件帐户和下载某些附件。此cron作业将每分钟运行一次。我的问题是,当第一个脚本下载电子邮件附件时,第二个(或第三个或第四个…)脚本很可能与之前执行的脚本一起运行。问题是,我不确定什么是防止后续脚本尝试下载以前脚本已下载(或当前正在下载)的电子邮件附件的最佳方法 其他详情: 使用CodeIgniter 使用Zend邮件库访问电子邮件和下载附件 电子邮件可能会是POP3 我想知道我是否能以某种方式使用“message id”头。您可以通过使用锁文件防止并发cro

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

其他详情:

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

我想知道我是否能以某种方式使用“message id”头。

您可以通过使用锁文件防止并发cron脚本运行。您可能不希望并发脚本下载附件,您将面临恶劣的竞争条件

工作原理如下:

starter.sh

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

  • 进行实际下载
编辑

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

因为他们使用的是线程安全的数据结构(数据库),所以他们可以在每一行上设置一个标志,表示下载/下载


他们只是在循环中使用顶部的sql select(select top 1未下载/下载消息)。您需要一些东西来处理崩溃和重新启动php进程,但这就是它的jist。

多个脚本同时运行实际上是理想的。我正在尝试模拟多线程。我每小时处理数千封电子邮件附件。