这是一个cronjob脚本。 cronjob每分钟都在运行。
cronjob用于更新数据库中的实时计数器字段。
我有两次和一个计数限制器:
start: 2012-08-29 09:55:00
end: 2012-08-29 19:00:00
limit: 5000
如何从开始日期,结束日期和限制开始,让系统计算一个数字,以便添加到计数器执行?
因此,当结束日期结束时,计数器应该与输入的限制一样大
示例,现在我得到了这个:
if ( $setting['limit'] > $setting['counter'] )
{
$rand = rand(5, 300);
DB::update('settings')
->set(array('counter' => DB::expr('counter+ '.$rand)))
->where('id', '=', $setting['id'])
->execute();
}
这只是给我一个5到300之间的数字,并在每次刷新/执行脚本时添加到计数器。
这样很可能计数器没有达到极限,例如,如果开始日期和结束日期彼此接近且随机值低于100,那么它将无法达到限制5000.
那么如何根据开始和结束日期,限制和当前计数,让系统计算出要添加到计数器的正确比率数?
答案 0 :(得分:1)
Counter Limit * (Current time in minutes - Start time in minutes)/(End time in minutes - Start time in minutes) = Current counter number
基本比率,虽然这是一个数学问题而非编程问题...
此外,如果您没有使用支持小数的MySQL类型,则可能需要对结果进行舍入。
所以在你的cronjob中:
$start=strtotime($setting["starttime"]);//Or whatever your local copy of the start time is
$end=strtotime($setting["endtime"]);//Or whatever your local copy of the end time is
$current=time();
$counter = $current>=$end?$setting["limit"]:round($setting['limit'] * ($current-$start)/($end-$start));
DB::update('settings')
->set(array('counter' => $counter))
->where('id', '=', $setting['id'])
->execute();