ev.php,PHP的Ev教程三(Periodic watcher)

Periodic watcher operation modes (周期性观察者的运行模式)

根据偏移、间隔和重新调度参数,不同周期的观察者工作

offset

绝对定时器。在此模式中,interval = 0,reschedule_cb = NULL. 这一次只是简单的触发在时钟时间偏移,不重复。当时间跳跃发生时,它不会调整,也就是说,如果它在2014/01/01运行,那么当系统时间达到或超过这个时间时,它将运行。

代码

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 = 0,reschedule_cb = NULL; 观察者将总是被安排在下一个偏移量offset + N * interval time(N代表某个整数)超时,然后重复,不管任何时间跳跃。

这并不意味着触发器之间总是有3600秒的时间,但只有当系统时间显示一个完整的小时(UTC)时才会调用回调。

这可以用来创建不随系统时间漂移的定时器:

代码

//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 )下一个可能的时间,不管任何时间跳跃。

reschedule_cb

手动重调度模式。在这种模式reschedule_cb是可调用。

间隔和偏移都被忽略了。相反,每次周期性观察者被调度时,重新调度回调(reschedule_cb)将首先以观察者的方式调用,而当前时间作为第二个参数。

这个回调永远不能停止或破坏这个或任何其他周期性观察者,并且不能调用任何事件循环函数或方法。停止它会先返回1000,再停止。一个EvPrepare观察者可以用于此任务。

它必须根据传递的时间值(也就是说,大于或等于第二个参数的最低时间值。)返回下一次触发。它通常会在调用回调之前被调用,但也可能在其他时候被调用。

代码

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值