根據偏移、間隔和從新調度參數,不一樣週期的觀察者工做php
絕對定時器。在此模式中,interval = 0
,reschedule_cb = NULL
. 這一次只是簡單的觸發在時鐘時間偏移,不重複。當時間跳躍發生時,它不會調整,也就是說,若是它在2014/01/01運行,那麼當系統時間達到或超過這個時間時,它將運行。函數
<?php echo "start : " . time() . PHP_EOL; //interval = 0 and reschedule_cb = NULL 在絕對的時間點上執行 若是offset<=當前時間會當即執行 $w1 = new EvPeriodic(time() + 10, 0.0, NULL, function ($w, $revents) { echo "w1: enter:", time(), PHP_EOL; sleep(5); echo "w1: end:", time(), PHP_EOL; }); //interval = 0 and reschedule_cb = NULL 不收其餘timer的影響,仍是在絕對的時間點上執行 若是offset<=當前時間會當即執行 $w11 = new EvPeriodic(time() + 20, 0.0, NULL, function ($w, $revents) { echo "w11: enter:", time(), PHP_EOL; }); ?>
start : 1529568868 w1: enter:1529568877 w1: end:1529568882 w11: enter:1529568888 # 若是咱們吧offset都改爲改爲當前時間 再執行結果 start : 1529568995 w11: enter:1529568995 w1: enter:1529568995 w1: end:1529569000
重複間隔定時器。在這種模式offset = 0
,reschedule_cb = NULL
; 觀察者將老是被安排在下一個偏移量offset + N * interval time
(N表明某個整數)超時,而後重複,無論任什麼時候間跳躍。code
這並不意味着觸發器之間老是有3600秒的時間,但只有當系統時間顯示一個完整的小時(UTC)時纔會調用回調。事件
這能夠用來建立不隨系統時間漂移的定時器:io
<?php //offset = 0 and reschedule_cb = NULL 間隔執行,固然若是執行體時間過長,間隔會被延遲 $w2 = new EvPeriodic(0.0, 2.0, NULL, function ($w, $revents) { echo "w2:enter:", time(), PHP_EOL; // sleep(3); echo "w2:end:", time(), PHP_EOL; }); //offset = 0 and reschedule_cb = NULL 間隔執行,固然若是執行體時間過長,間隔會被延遲,且多個觀察者會互相影響間隔時間 $w3 = new EvPeriodic(0.0, 2.0, NULL, function ($w, $revents) { echo "w3:enter:", time(), PHP_EOL; // sleep(3); echo "w3:end:", time(), PHP_EOL; }); Ev::run();
w2:enter:1529569458 w2:end:1529569458 w3:enter:1529569458 w3:end:1529569458 w3:enter:1529569460 w3:end:1529569460 w2:enter:1529569460 w2:end:1529569460 w2:enter:1529569462 w2:end:1529569462 w3:enter:1529569462 w3:end:1529569462 w3:enter:1529569464 w3:end:1529569464 w2:enter:1529569464 w2:end:1529569464 w2:enter:1529569466 w2:end:1529569466 w3:enter:1529569466 w3:end:1529569466 # 咱們註釋w3代碼 並打開w2裏的sleep(3)執行結果 # 執行體時間 > 間隔時間 # 咱們發現下一次執行時間是上一次執行完成時間 w2:enter:1529570041 w2:end:1529570046 w2:enter:1529570046 w2:end:1529570051 w2:enter:1529570051 w2:end:1529570056 w2:enter:1529570056 w2:end:1529570061 w2:enter:1529570061 w2:end:1529570066 w2:enter:1529570066 # 咱們註釋w3代碼 並打開w2裏的sleep(1)執行結果 # 執行體時間<=間隔時間 # 咱們發現下一次執行時間是正常間隔後執行時間 w2:enter:1529570098 w2:end:1529570099 w2:enter:1529570100 w2:end:1529570101 w2:enter:1529570102 w2:end:1529570103 w2:enter:1529570104 # 咱們打開w3裏的sleep,而後再執行結果 # 某個觀察者間隔時間受執行體影響,且多個觀察者會互相影響間隔時間 w2:enter:1529569484 w2:end:1529569484 w3:enter:1529569484 w3:end:1529569487 w3:enter:1529569487 w3:end:1529569490 w2:enter:1529569490 w2:end:1529569490 w2:enter:1529569490 w2:end:1529569490 w3:enter:1529569490 w3:end:1529569493 w3:enter:1529569493 w3:end:1529569496 w2:enter:1529569496 w2:end:1529569496 w2:enter:1529569496 w2:end:1529569496 w3:enter:1529569496
若是單個watcher執行體時間 > 間隔時間,那麼下一次執行時間就是執行體完成時間
若是單個watcher執行體時間 <= 間隔時間,那麼下一次執行時間就是間隔後執行時間
若是多個watcher,各執行體的時間相互影響對方
EvPeriodic
將嘗試在這種模式下運行回調,在當`time = offset ( mod interval )下一個可能的時間,無論任什麼時候間跳躍。event
手動重調度模式。在這種模式reschedule_cb
是可調用。function
間隔和偏移都被忽略了。相反,每次週期性觀察者被調度時,從新調度回調(reschedule_cb
)將首先以觀察者的方式調用,而當前時間做爲第二個參數。擴展
這個回調永遠不能中止或破壞這個或任何其餘週期性觀察者,而且不能調用任何事件循環函數或方法。中止它會先返回1000,再中止。一個EvPrepare
觀察者能夠用於此任務。循環
它必須根據傳遞的時間值(也就是說,大於或等於第二個參數的最低時間值。)返回下一次觸發。它一般會在調用回調以前被調用,但也可能在其餘時候被調用。定時器
<?php function reschedule_cb_10dot5 ($watcher, $now) { return $now + (10.5 - fmod($now, 10.5)); } function reschedule_cb_10s ($watcher, $now) { return $now + 10.; } //PHP7.0版本不支持ev1.0.4版本,目前發現bug沒法正常根據reschedule_cb走,會意外的執行不可預測 //PHP5.6可正常,一樣下次執行收執行體裏的時間影響 $w5 = new EvPeriodic(0.0, 0.0, "reschedule_cb_10s", function ($w, $revents) { echo "w5:enter:", time(), PHP_EOL; sleep(15); echo "w5:end:", time(), PHP_EOL; }); Ev::run();
w5:enter:1529638365 w5:end:1529638380 w5:enter:1529638380 w5:end:1529638395 w5:enter:1529638395 w5:end:1529638410 w5:enter:1529638410 w5:end:1529638425 w5:enter:1529638425 w5:end:1529638440 w5:enter:1529638440 w5:end:1529638455 w5:enter:1529638455 w5:end:1529638470 w5:enter:1529638470 w5:end:1529638485 w5:enter:1529638485 w5:end:1529638500 w5:enter:1529638500 w5:end:1529638515 w5:enter:1529638515 # php 5.6 # php --ri ev Ev擴展信息 Ev support => enabled Debug support => disabled Version => 1.0.4 [root@localhost libev]# Version => 1.0.4