动态安排提醒电子邮件的最佳方式?任何比cron更好的东西


Best way to dynamically schedule reminder email? Anything better than cron?

您好,我正在开发一个web应用程序。其中一部分将允许用户安排在一天中的特定时间向他们发送"提醒"电子邮件。实现这一目标的最佳方法是什么?基本上,我提出的所有解决方案都是在"轮询"模式下运行的,而我想要的是"中断"模式。

以下是我提出的一些可能的解决方案:

  1. 每分钟都有一场裙带大火。启动的脚本会检查数据库,看看是否有电子邮件要发送,如果有,就会发送,否则就会返回睡眠状态。这样做的缺点是每分钟都会产生一些开销。此外,这可能不是一个可扩展的系统,尤其是当用户数量如此之大,可能需要一分钟以上才能发送所有电子邮件时。

  2. 与#1相同,但作业仅每15分钟启动一次。这更易于管理,但并不完美,因为它将用户限制在15分钟内提醒,而且在没有电子邮件可发送的情况下,它仍然会产生一些开销。不错,但也不完美。

  3. 让PHP exec()编写一些代码,在底层linux中动态更改crontab或调度"at"作业。这将给我带来我渴望的灵活性和"中断"类型的模型,但会在允许PHP执行()linux代码方面打开一个巨大的安全漏洞。所以,我要继续排除这个。

那么,还有什么比我想出的更好的吗?也许可以在不使用cron的情况下安排电子邮件?我很好奇你们对此有什么看法:)。

您可以拥有一个仍在运行的PHP脚本。每设置一个间隔,查询数据库中需要在下一个间隔发送的电子邮件。将其分解为一个数组,每分钟一组。因此,如果你选择15分钟,你会有一个包含15个条目的数组,每个条目都有当时需要发送的所有电子邮件。

然后,您可以使用分叉来拆分流程,一个处理发送电子邮件,另一个睡眠到下一分钟,然后再次拆分。为了扩展,您可以分叉多个进程,每个进程处理一定数量的电子邮件。

简而言之,一个进程管理队列,并分叉其他进程来处理发送。当队列为"空"时,它会得到更多。您可以让一个cron定期运行,以确保进程没有终止。

使用第一种变体。

发送可能需要一分钟以上的所有电子邮件

  1. 如果file_exists('mailing.q'),请检查;如果仍然存在-终止执行
  2. 创建文件mailing.q
  3. 发送电子邮件
  4. unlink('mailing.q')

不要考虑开销——在这种情况下不要。

在选项#1和#2中使用cron并没有什么特别的问题,我不知道你在使用什么样的应用程序,但让用户能够准确安排时间可能不是必要的。即便如此,如果您的脚本将提醒的状态标记为"挂起"或诸如此类,并且脚本的任何新实例只发送未"挂起或已发送"的实例,则可能不会有问题。

你可以使用Hudson或类似的应用程序,它可以帮助脚本管理,并使你能够关注故障等。它甚至可以在出现故障时发出通知。它支持自己的基于java的cron系统。

如果应用程序确实变大了,你当然可能想把这个过程从你的网络服务器上卸载到一个单独的服务器上。如果您还没有使用外部SMTP服务,您可能还想了解用于发送邮件的第三方工具,并了解它们可能具有哪些集成工具。这也应该提高投递率等。

不要混淆排队发送邮件和实际发送邮件。

您的邮件服务器可能需要15分钟才能发送一封电子邮件。但是,我的mail(1)只需要0.036s就可以对要发送的邮件消息进行排队。

即使你每分钟要发送1600多封电子邮件(干得好,1/3概率,1/2概率,然后对剩余的进行排队。

有一个命令hostman,允许您在特定时间调用函数。这应该是你想要的。


这是我最初的建议:

组合怎么样?

  1. 让cron作业每年运行一次<时间span>
  2. 让它用时间戳=>列表填充文件,该列表反映<当前时间>+<时间span>
  3. 如果在电子邮件列表文件中找到时间,则每分钟运行一次第二次cron,然后运行电子邮件发送脚本