【问题标题】:How should I handle multiple seperate batch email 'streams'?我应该如何处理多个单独的批处理电子邮件“流”?
【发布时间】:2015-11-05 21:36:24
【问题描述】:

我在 Windows Server 下设置了以下(简化的)批处理电子邮件流程:

  • 用户执行需要发送电子邮件的操作;
  • 创建电子邮件所需的数据被插入到 SQL Server 表中;
  • 每 6 小时一次,Task Scheduler 调用一个 PHP 文件,该文件遍历表,创建并发送每封未处理的电子邮件。

这很有效,但是应用程序所有者希望更定期地发送某些类型的电子邮件,在这种情况下,每 20 分钟发送一次。

我的第一个想法是设置另一个任务计划程序条目,但这引发了每 6 小时发生一次的问题,此时两个任务将同时运行。它还需要创建另一个 PHP 文件,这不是问题,但很烦人。

我考虑的另一种选择是将调度程序设置为每 20 分钟一次,并将“我发送什么以及何时发送”逻辑合并到批处理文件本身中 - 如果是上午 12 点、上午 6 点、下午 12 点或下午 6 点,则执行两组电子邮件,否则只需执行 20 分钟。但是,这确实需要在那些时候进行硬编码,而且似乎不应该是第一选择。

有没有更好的方法来做到这一点?

【问题讨论】:

  • 我建议在 sql 表中为您的消息引入某种严重性。基本上,您可以每 5 分钟左右运行一次调度程序,然后根据要发送的电子邮件的严重程度来决定。此外,您可以引入另一个表,其中存储每个严重性的时间,例如 20 分钟或 6 小时。
  • @RaphaelMüller 这基本上就是我想做的,是的。问题在于“刚刚决定”的部分。我是否坚持必须输入“如果是下午 6 点交付这些”,“如果是 X:20/X:40/X:00 交付这些”?还是有其他方法可以告诉程序何时发送某些电子邮件组?

标签: php email scheduled-tasks batch-processing


【解决方案1】:

再想一想,我意识到我可以通过应用 PHP time() 函数和一些模运算来完成我想要的:

$runTime = time();                //Set time the program was run, seconds since epoch
$modTimeHour = $runTime % 3600;   //3600 seconds in an hour
$modTimeTwenty = $runTime % 1200; //1200 seconds in twenty minutes

//Task Scheduler doesn't always run exactly on the dot, so give it some leeway
if ($modTimeHour < 5 || $modTimeHour > 3595) {  
     //send emails - category 1
}

if ($modTimeTwenty < 5 || $modTimeTwenty > 1195) {
    //send emails - category 2
}

通过获取纪元以来的秒数,并检查我感兴趣的时间段内秒数的模数是否在一定范围内,我可以有许多不同的“流”都在适当的时间流出.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 2012-02-20
    • 2021-03-03
    • 2011-06-11
    • 2013-10-15
    • 1970-01-01
    • 2012-12-18
    相关资源
    最近更新 更多