PHP脚本作为Cron作业发送电子邮件,防止多个进程

时间:2011-04-17 15:02:06

标签: php email cron

我正在开发一个提醒应用程序,用户可以通过选择提醒的时间和日期向自己发送电子邮件。

所以我会使用cron job发送每分钟后运行的电子邮件,并检查是否有任何电子邮件待发送。

现在,我的问题是,如果在任何给定时间我有50-100个电子邮件发送,那么我认为发送电子邮件可能需要超过1分钟,因此另一个cron作业将开始运行相同的脚本。那会有什么问题吗?运行cron作业每分钟服务器资源消耗?如果是,那么实现相同功能的其他选项是什么。

请建议!!

由于

3 个答案:

答案 0 :(得分:3)

使用锁定文件策略...在启动新进程时创建锁定文件,并且每个后续进程应在启动之前检查该锁定文件是否存在。如果锁定文件存在,那么您知道之前的进程仍在运行。

但是,您需要确保现有的锁定文件仍然有效。可能是在不删除锁定文件的情况下退出创建锁定文件的进程。将创建锁文件的进程的进程ID(PID)写入锁文件。找到现有锁文件的后续进程应从文件中读取PID,然后确保该进程仍在运行。

此外,限制每个进程发送的邮件数量是个好主意。如果将其保持开放状态,系统管理员可能会遇到与长时间运行进程相关的问题。 :)

答案 1 :(得分:0)

好吧,无论何时我通过PHP发送电子邮件,我都是通过mailQ包装器完成的,它不会立即发送电子邮件,而是将其放在队列中发送(并通过自己的独立脚本发送)。如果采用相同的方法,您可以简单地将电子邮件添加到队列中(带有消息,收件人等的SQL表以及表明是否已发送的标志)。

然后你仍然可以每分钟运行一次脚本,然后有一个电子邮件脚本(查找邮件表以查看是否有需要发送的待处理邮件)作为一个独立的cron作业运行 - 因此工作由于作业应该并行运行,因此负载完全分开。

我可以100%放心地保证,只要您的代码合理,每分钟运行一份工作永远不会成为问题。我已经在我的CMS中使用这种方法多年来平衡更新不是高优先级的东西之间的负载,并且只会减慢客户端的浏览体验。

自从使用这种方法后,我从未遇到过性能,负载或滞后问题,并且事情继续迅速采取行动。

我同意AJ的观点,因为对一批中可以发送的邮件数量设置上限非常重要。使用排队系统是理想的,因为它一次只发送X挂起,并且它们仍然在队列中等待。

答案 2 :(得分:0)

如果你在Linux上,你可以使用它来设置一个定期执行的服务,该服务一直持续到完成,然后等待一分钟等。

http://code.google.com/p/atomservice/

我一直用它来做这样的事情。您甚至可以设置每次执行发送的x封电子邮件的限制。