我应该如何处理多个单独的批处理电子邮件"流"?



我在Windows服务器上设置了以下(简化的)批量电子邮件流程:

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

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

我的第一个想法是设置另一个Task Scheduler条目,但这引发了每6个小时发生什么情况的问题,当两个任务将同时运行时。它还需要创建另一个PHP文件,这不是一个真正的问题,但很烦人。

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

有更好的方法来完成这个吗?

在稍微考虑了一下之后,我意识到我可以通过应用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
}

通过获取自epoch以来的秒数,并检查我感兴趣的时间段内秒数的模是否在一定范围内,我可以让许多不同的"流"都在适当的时间发出

最新更新