dynamic安排提醒电子邮件的最佳方式? 比cron更好的吗?

问候,我正在开发一个Web应用程序。 其中的一部分将允许用户安排“提醒”电子邮件发送给他们在一天的特定时间。 什么是完成这个最好的方法? 基本上,当我想要的是一个“中断”模式时,我所提出的所有解决scheme都以“轮询”模式进行操作。

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

  1. 每分钟都有一个cronjob火灾。 启动的脚本检查数据库以查看是否有任何电子邮件发送,如果有,则发送它们,否则它会重新进入睡眠状态。 缺点是每分钟都会有一些开销。 此外,这可能不是一个可扩展的系统,特别是当用户数量过大,发送所有电子邮件可能花费一分钟。

  2. 与#1相同,但工作每15分钟才会启动。 这样更容易pipe理,但并不完美,因为它限制了用户在15分钟的时间内提醒,并且在没有电子邮件发送时仍然会产生一些开销。 不错,但也不完美。

  3. 让PHP exec()有一些代码可以dynamic地改变crontab或者在底层的linux中调度“at”作业。 这会给我灵活性和“中断”型的模型,所以我会很渴望,但是会让PHP执行exec()linux代码的时候会出现一个巨大的安全漏洞。 所以,我要继续前进,把这个排除在外。

那么,比我想出来的更好吗? 也许没有使用cron安排电子邮件的方式? 我很好奇,看看你们有什么要说的:)。

Solutions Collecting From Web of "dynamic安排提醒电子邮件的最佳方式? 比cron更好的吗?"

使用第一个变体。

发送所有电子邮件可能需要一分钟时间

  1. 检查,如果file_exists('mailing.q'); 如果仍然存在 – 终止执行。
  2. 创建文件mailing.q
  3. 发电子邮件
  4. 取消关联( 'mailing.q');

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

你可以有一个PHP脚本保持运行。 每设置一个时间间隔,查询数据库中下一个时间间隔内需要发送的邮件。 把它分成一组,每分钟一组。 所以,如果你选择15分钟,你将有一个阵列有15个条目,每个条目都有需要发送的所有电子邮件。

然后,你可以使用分叉来分割进程,一个处理发送电子邮件,另一个睡觉,直到下一分钟,再次分裂。 为了扩展,你可以在每个进程中分派多个进程来处理一定数量的邮件。

简而言之,一个进程管理队列并分叉其他进程来处理发送。 当队列是“空的”它得到更多。 您可以定期运行cron以确保进程没有死亡。

在选项#1和#2中使用cron没有什么特别的错误,我不知道你使用的是什么类型的应用程序,但是让用户能够按照确切的分钟进行安排可能没有必要。 即使如此,如果您的脚本将提醒状态标记为“正在等待”,或者此类脚本的任何新实例仅发送不是“正在等待”或“已发送”的脚本,那么这可能不会成为问题。

你可以使用哈德森或类似的应用程序,可以帮助脚本管理,并使您能够留意失败等,甚至可以发出通知,当有故障。 它支持它自己的基于java的cron系统。

如果应用程序变得很大,那么您肯定可能希望将此进程从Web服务器卸载到单独的服务器上。 如果您还没有使用外部SMTP服务,也可能想要查看用于发送邮件的第三方工具,并查看它们可能具有的集成工具。 这也应该提高交货率等

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

您的邮件服务器可能需要十五分钟才能发送一封电子邮件。 但是,我的mail(1)只有0.036s排队邮件发送。

即使你每分钟发送超过1600封电子邮件(好工作!),你可以稍微调整一下你的代码,以便在几分钟之前概率地发送提醒电子邮件,预期会出现“尖峰”在你的数据库中提前5分钟,看是否有大于1000个邮件要发送,并以1/5的概率,1/4的概率,1/3的概率,1/2的概率排队,然后排队。

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


这是我原来的建议:

怎么样的组合?

  1. 有一个cron作业运行一次<timespan>。
  2. 使用时间戳=>列表来填充文件,以反映在<当前时间> + <时间段>之前是否有电子邮件。
  3. 如果在电子邮件列表文件中找到时间,请每隔一分钟运行一次,然后运行电子邮件发送脚本。