我正在开发一个提醒应用程序,用户可以通过选择提醒的时间和日期向自己发送电子邮件。
所以我会使用cron job发送每分钟后运行的电子邮件,并检查是否有任何电子邮件待发送。
现在,我的问题是,如果在任何给定时间我有50-100个电子邮件发送,那么我认为发送电子邮件可能需要超过1分钟,因此另一个cron作业将开始运行相同的脚本。那会有什么问题吗?运行cron作业每分钟服务器资源消耗?如果是,那么实现相同功能的其他选项是什么。
请建议!!
由于
答案 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封电子邮件的限制。