0

これは cronjob スクリプトです。cronjob は毎分実行されています。

cronjob は、データベース内の live-counter フィールドを更新することです。

私は2回とカウントリミッターを持っています:

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 に答える