我有一个cron作业,它从DB获取结果,检查用户设置的间隔是否属于今天的日期。我目前正在考虑如下:
这样我只会在设定的时间过去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作业运行此脚本。脚本再次需要检查今天是否属于设定的频率。
另外,为了论证,这是计算差异的最佳逻辑吗?
谢谢。
答案 0 :(得分:0)
这将有效
Table "schedule"
`last_run` timestamp,
`frequency_seconds` int
示例查询应该每两周执行一次的任务:
SELECT *
FROM schedule
WHERE TIMESTAMPDIFF(last_run, NOW()) >= frequency_seconds
获取行后,将last_run
更新为NOW()