EvPeriodic 監視器會根據 offset
、interval
和 reschedule_cb
參數以不同模式運作。
絕對計時器。在此模式中,interval
= 0
,reschedule_cb
= null
。這個計時器會在系統時鐘時間達到 offset
時觸發,且不會重複。它不會因時間跳躍而調整,也就是說,如果它設定在 _2014 年 1 月 1 日_ 執行,則它會在系統時間達到或超過這個時間時執行。
重複間隔計時器。在此模式中,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
) 的時間點執行回呼函式,而不管任何時間跳躍。
手動重新排程模式。在此模式下,reschedule_cb
是一個 可呼叫的 函式。
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();
?>