计算任务的频率间隔

时间:2017-05-30 08:32:55

标签: php datetime intervals

我有一个cron作业,它从DB获取结果,检查用户设置的间隔是否属于今天的日期。我目前正在考虑如下:

  1. 获取该行的时间列。例如:2017-05-25 00:00:00
  2. 获取频率设置。例如:每两周一次。
  3. 以上述格式获取当前日期。例如:2017-05-31 00:00:00
  4. 获得天数的差异。例如:6天。
  5. 将频率设置转换为天数。例如:2周= 14天;
  6. 除以(时间(天)的差异)(以天为单位的频率)。例如:6/14
  7. 这样我只会在设定的时间过去2周后才能得到结果。即,14 / 14,28 / 14,42 / 14,......

    如果频率是几个月,我可以开始除以30.但不知何故,这感觉就像一个hacky方式。所以我的问题是,如果有更好的方法来进行此计算以检查差异。

    这就是我所做的,正如上面的例子所解释的那样。

    ` $frequency = ; // Get the relevant fields from db
      $today = date(Y-m-d H:i:s);
         foreach ($frequency as $key => $value) {
           $frequency_in_days;
           $frequency_type = $value->type;
           $frequency_repeat = $value->repeat;
    
           if($frequency_type == 1){
             $frequency_in_days = $frequency_repeat;
           } elseif($frequency_type == 2) {
             $frequency_in_days = $frequency_repeat * 7;
           } elseif($frequency_type == 3) {
             $frequency_in_days = $frequency_repeat * 30;
           } elseif($frequency_type == 4) {
             $frequency_in_days = $frequency_repeat * 365;
           }
    
          //  Get number of days spent between start_date and today in days.
           $interval = date_diff($value->start_date, $today)->format('%a');
           $result = $interval % $frequency_in_days;
    
           if ($result == 0) {
            //  Frequency falls today! Do the job.
           }
         }`
    

    注意:cron作业运行此脚本。脚本再次需要检查今天是否属于设定的频率。

    另外,为了论证,这是计算差异的最佳逻辑吗?

    谢谢。

1 个答案:

答案 0 :(得分:0)

这将有效

Table "schedule" 
`last_run` timestamp, 
`frequency_seconds` int

示例查询应该每两周执行一次的任务:

SELECT *
FROM schedule
WHERE TIMESTAMPDIFF(last_run, NOW()) >= frequency_seconds
获取行后,

last_run更新为NOW()