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