PHP的Ev教程三(Periodic watcher)

Periodic watcher operation modes (週期性觀察者的運行模式)

根據偏移、間隔和從新調度參數,不一樣週期的觀察者工做php

offset

絕對定時器。在此模式中,interval = 0reschedule_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

interval

重複間隔定時器。在這種模式offset = 0reschedule_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

手動重調度模式。在這種模式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
相關文章
相關標籤/搜索