根据偏移、间隔和从新调度参数,不一样周期的观察者工做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