International PHP Conference Berlin 2025

Periodic ウォッチャーの操作モード

EvPeriodic ウォッチャーは、パラメータ offsetinterval および reschedule_cb の設定によってさまざまなモードで動作します。

  1. 絶対時刻のタイマー。 このモードでは、interval = 0 そして reschedule_cb = null となります。 このときは、単純に offset で指定した時刻に実行してその後は繰り返しません。 時刻の飛びがあっても調整はしません。つまり、 January 1st 2014 に実行するように設定した場合は、 システム時刻がこの時刻に達するかこの時刻を過ぎたときに実行されます。

  2. 繰り返しタイマー。 このモードでは、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) となる次の時刻にコールバックをこのモードで実行しようと試みます。 時刻の飛びは気にしません。

  3. 手動再スケジュールモード。 このモードでは、reschedule_cbcallable になります。

    intervaloffset はどちらも無視します。毎回定期ウォッチャーがスケジュールされ、再スケジュールコールバック (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();
    ?>
add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top