0

这是一个 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。

那么如何让系统根据开始和结束日期、限制和当前计数计算出正确的比率数以添加到计数器中呢?

4

1 回答 1

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();
于 2012-08-29T08:56:17.410 回答