EvPeriodic ウォッチャーは、パラメータ offset、interval および reschedule_cb の設定によってさまざまなモードで動作します。
offset
interval
reschedule_cb
絶対時刻のタイマー。 このモードでは、interval = 0 そして reschedule_cb = null となります。 このときは、単純に offset で指定した時刻に実行してその後は繰り返しません。 時刻の飛びがあっても調整はしません。つまり、 January 1st 2014 に実行するように設定した場合は、 システム時刻がこの時刻に達するかこの時刻を過ぎたときに実行されます。
0
null
繰り返しタイマー。 このモードでは、interval > 0 そして reschedule_cb = null となります。ウォッチャーは常に、 offset + N * interval (N は何らかの整数) 経過後にタイムアウトするようにスケジュールされ、 その後繰り返します。時刻の飛びは気にしません。
N
これを使うと、システムの時刻に流されないタイマーを作れます。
<?php $hourly = EvPeriodic(0, 3600, NULL, function () { echo "once per hour\n"; }); ?>
3600
EvPeriodic は、 time = offset (mod interval) となる次の時刻にコールバックをこのモードで実行しようと試みます。 時刻の飛びは気にしません。
mod
手動再スケジュールモード。 このモードでは、reschedule_cb が callable になります。
interval と offset はどちらも無視します。毎回定期ウォッチャーがスケジュールされ、再スケジュールコールバック (reschedule_cb) が呼び出されます。 コールバックの最初の引数がウォッチャー、そして二番目の引数が現在時刻となります。
このコールバックは、自分自身あるいは他の定期ウォッチャーを停止したり破棄したり してはいけません。また、 イベントループ関数やメソッドも 呼んではいけません。 ウォッチャーを止めるには、1e30 を返した後で停止します。 このタスクには、EvPrepare ウォッチャーが使えます。
1e30
コールバックは、次の実行時刻を返す必要があります。次の実行時刻は、 コールバックに渡された時刻をベースにしたものです (つまり、二番目の引数で受け取った時刻と同じかそれよりも大きな値を返します)。 コールバックが呼ばれるのは、通常はイベントが発生する直前ですが、それ以外の場合にも呼ばれる可能性があります。
例1 再スケジュールコールバックの利用
<?php // 10.5 秒おきに繰り返します function reschedule_cb ($watcher, $now) { return $now + (10.5. - fmod($now, 10.5)); } $w = new EvPeriodic(0., 0., "reschedule_cb", function ($w, $revents) { echo time(), PHP_EOL; }); Ev::run(); ?>