Ev Periodic watcher operation modes

EvPeriodic 감시자는 offset , intervalreschedule_cb 매개변수에 따라 다른 모드에서 작동합니다.

  1. Absolute timer. 이 모드 interval = 0 에서 reschedule_cb = null입니다. 이 시간은 단순히 wallclock 시간 offset에서 시작되고 반복되지 않습니다. 시간 점프가 발생할 때 조정되지 않습니다. 즉, January 1st 2014에 실행되는 경우 시스템 시간이 이 시간에 도달하거나 초과할 때 실행됩니다.
  2. Repeating interval timer. 이 모드 interval > 0에서 reschedule_cb = null; 감시자는 항상 다음 offset + N * interval 시간(일부 정수 N의 경우)에서 시간 초과된 다음 시간 점프에 관계없이 반복하도록 예약됩니다.

    이것은 시스템 시간과 관련하여 드리프트하지 않는 타이머를 만드는 데 사용할 수 있습니다.

                          
    <?php
    $hourly = EvPeriodic(0, 3600, NULL, function () {
      echo "once per hour\n";
    });
    ?>
                          
                        

    이는 트리거 사이에 항상 3600초가 있다는 것을 의미하지는 않지만 시스템 시간이 전체 시간(UTC)을 표시할 때만 콜백이 호출됩니다.

    EvPeriodic은 시간 점프에 관계없이 time = offset( mod interval )인 다음 가능한 시간에 이 모드에서 콜백을 실행하려고 시도합니다.

  3. Manual reschedule mode . 이 모드에서 reschedule_cbcallable 가능합니다.

    intervaloffset은 모두 무시됩니다. 대신, 주기적 감시자가 예약될 때마다 재스케줄 콜백( reschedule_cb )이 감시자를 첫 번째로 호출하고 현재 시간을 두 번째 인수로 호출합니다.

    이 콜백은 이 또는 다른 주기적인 감시자를 중지하거나 파괴해서는 안 되며 이벤트 루프 함수나 메서드를 호출해서는 안 됩니다. 중지하려면 1e30을 반환하고 나중에 중지합니다. 이 작업에 EvPrepare 감시자를 사용할 수 있습니다.

    전달된 시간 값(즉, 두 번째 인수보다 크거나 같은 가장 낮은 시간 값)을 기반으로 트리거할 다음 시간을 반환해야 합니다. 일반적으로 콜백이 트리거되기 직전에 호출되지만 다른 시간에도 호출될 수 있습니다.

    예제 #1 일정 변경 콜백 사용

                          
    <?php
    // Tick each 10.5 seconds
    
    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();
    ?>