PHP Conference Japan 2024

週期性監視器操作模式

EvPeriodic 監視器會根據 offsetintervalreschedule_cb 參數以不同模式運作。

  1. 絕對計時器。在此模式中,interval = 0reschedule_cb = null。這個計時器會在系統時鐘時間達到 offset 時觸發,且不會重複。它不會因時間跳躍而調整,也就是說,如果它設定在 _2014 年 1 月 1 日_ 執行,則它會在系統時間達到或超過這個時間時執行。

  2. 重複間隔計時器。在此模式中,interval > 0reschedule_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. 手動重新排程模式。在此模式下,reschedule_cb 是一個 可呼叫的 函式。

    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();
    ?>
新增註釋

使用者貢獻的註釋

此頁面沒有使用者貢獻的註釋。
To Top