让系统根据php中的日期计算添加到计数器的数量

时间:2012-08-29 08:44:42

标签: php

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

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

1 个答案:

答案 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();