当前位置: 首页 > news >正文

PHP的Ev教程三(Periodic watcher)

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

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

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代表某个整数)超时,然后重复,不管任何时间跳跃。

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

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

代码

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

reschedule_cb

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

间隔和偏移都被忽略了。相反,每次周期性观察者被调度时,重新调度回调(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

相关文章:

  • 雇佣兵
  • mongoDB伪副本集集群搭建
  • 《PHP精粹:编写高效PHP代码》——2.6节高级PDO特征
  • 影响数据中心托管的因素
  • 中兴视觉大数据报道:人工智能应用将会帮助我们更好的决策
  • 如何使用Shodan搜索引擎来诊断漏洞?
  • 如何用App工厂免费生成电商应用
  • 代理(Proxy)和反射(Reflection)
  • 区块链物联网的垂直领域应用
  • 从发展模式看SaaS服务的昨天、今天和明天
  • 升级pip 到 10.0.1
  • sureface 屏幕残影问题官方解决方案 - 卸载显卡驱动
  • [20170728]oracle保留字.txt
  • 为何我们要用 React 来写小程序 - Taro 诞生记
  • 漫步云端:谁给你的安全买单?
  • 【译】JS基础算法脚本:字符串结尾
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 11111111
  • classpath对获取配置文件的影响
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • EventListener原理
  • If…else
  • JavaScript设计模式与开发实践系列之策略模式
  • Java小白进阶笔记(3)-初级面向对象
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • vue自定义指令实现v-tap插件
  • 给初学者:JavaScript 中数组操作注意点
  • 关于springcloud Gateway中的限流
  • 扑朔迷离的属性和特性【彻底弄清】
  • 手写双向链表LinkedList的几个常用功能
  • 算法系列——算法入门之递归分而治之思想的实现
  • k8s使用glusterfs实现动态持久化存储
  • Spring Batch JSON 支持
  • #### go map 底层结构 ####
  • #Linux(make工具和makefile文件以及makefile语法)
  • #宝哥教你#查看jquery绑定的事件函数
  • (function(){})()的分步解析
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (九十四)函数和二维数组
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (力扣题库)跳跃游戏II(c++)
  • (十五)使用Nexus创建Maven私服
  • (转)h264中avc和flv数据的解析
  • .NET MVC 验证码
  • .NET 中 GetProcess 相关方法的性能
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • @SuppressWarnings注解
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [android] 切换界面的通用处理
  • [Android]How to use FFmpeg to decode Android f...