Swoole提供了毫秒精度的定时器,所有操作都是内存操作,无额外的IO开销。

下面让我们一起详细了解每个函数的作用:

1) 函数tick:设置一个间隔时钟定时器,这个定时器会持续触发

Swoole\Timer::tick(int $msec, callable $callback_function, ...$params): int

$mesc:指定时间,单位毫秒【如 1000 表示 1 秒,v4.2.10 以下版本最大不得超过 86400000】

$callback_function:时间到期后所执行的函数,必须是可以调用的,格式为:callbackFunction(int $timer_id, ...$params),可以使用匿名函数的 use 语法传递参数到回调函数中。

$params:给执行函数传递数据【此参数也为可选参数】

返回值:定时器的ID

示例:

Swoole\Timer::tick(3000, function (int $timer_id, $param1, $param2) {
echo "timer_id #$timer_id, after 3000ms.\n";
echo "param1 is $param1, param2 is $param2.\n"; Swoole\Timer::tick(14000, function ($timer_id) {
echo "timer_id #$timer_id, after 14000ms.\n";
});
}, "A", "B");

注意事项:

定时器的校正:定时器回调函数的执行时间不影响下一次定时器执行的时间。实例:在 0.002s 设置了 10ms 的 tick 定时器,第一次会在 0.012s 执行回调函数,如果回调函数执行了 5ms,下一次定时器仍然会在 0.022s 时触发,而不是 0.027s。但如果定时器回调函数的执行时间过长,甚至覆盖了下一次定时器执行的时间。底层会进行时间校正,丢弃已过期的行为,在下一时间回调。如上面例子中 0.012s 时的回调函数执行了 15ms,本该在 0.022s 产生一次定时回调。实际上本次定时器在 0.027s 才返回,这时定时早已过期。底层会在 0.032s 时再次触发定时器回调。

协程模式:在协程环境下 Timer::tick 回调中会自动创建一个协程,可以直接使用协程相关 API。

2) 函数after():在指定的时间后执行函数。Swoole\Timer::after 函数是一个一次性定时器,执行完成后就会销毁。此函数与 PHP 标准库提供的 sleep 函数不同,after 是非阻塞的。

Swoole\Timer::after(int $msec, callable $callback_function, ...$params): int

$mesc:指定时间,单位毫秒【如 1000 表示 1 秒,v4.2.10 以下版本最大不得超过 86400000】

$callback_function:时间到期后所执行的函数,必须是可以调用的,格式为:callbackFunction(int $timer_id, ...$params),可以使用匿名函数的 use 语法传递参数到回调函数中。

$params:给执行函数传递数据【此参数也为可选参数】

返回值:定时器的ID

示例:

$timer_id=Swoole\Timer::tick(1000, function () {
echo "after 1000ms.\n";
});
Swoole\Timer::after(10000,function() use ($timer_id){
echo "clear:\n";
Swoole\Timer::clear($timer_id);
});

3) 函数clear():使用定时器 ID 来删除定时器。

Swoole\Timer::clear(int $timer_id): bool

$timer_id:定时器 ID【调用 Timer::tick、Timer::after 后会返回一个整数的 ID】

注意:Swoole\Timer::clear 不能用于清除其他进程的定时器,只作用于当前进程

4) clearAll():清除当前 Worker 进程内的所有定时器。

Swoole\Timer::clearAll(): bool

5) info():返回 timer 的信息。

Swoole\Timer::info(int $timer_id): array

返回值示例:

array(4) {
["exec_msec"]=>
int(1000)
["interval"]=>
int(0)
["round"]=>
int(0)
["removed"]=>
bool(false)
}

6) 函数list():返回定时器迭代器,可使用 foreach 遍历当前 Worker 进程内所有 timer 的 id

Swoole\Timer::list(): Swoole\Timer\Iterator

示例:

foreach (Swoole\Timer::list() as $timer_id) {
var_dump(Swoole\Timer::info($timer_id));
}

7) 函数stat():查看定时器状态。

Swoole\Timer::stats(): array

返回值示例:

array(3) {
["initialized"]=>
bool(true)
["num"]=>
int(1000)
["round"]=>
int(1)
}

8) 函数set():设置定时器相关参数。

Swoole\Timer::set(array $array): void

例如:默认定时器在执行回调函数时会自动创建协程,可单独设置定时器关闭协程。

Swoole\Timer::set([
'enable_coroutine' => false,
]);

Swoole毫秒定时器的内容相对比较简单,这一节到此就要结束了。请关注后续的多进程与协程核心API的讨论。

---------------------------  我是可爱的分割线  ----------------------------

最后博主借地宣传一下,漳州编程小组招新了,这是一个面向漳州青少年信息学/软件设计的学习小组,有意向的同学点击链接,联系我吧。

Swoole从入门到入土(21)——毫秒定时器的更多相关文章

  1. PHP实现的毫秒定时器,同时解决进程不重复堆积

    定时器任务,在WEB应用比较常见,如何使用PHP实现定时器任务,大致有两种方案:1)使用Crontab命令,写一个shell脚本,在脚本中调用PHP文件,然后定期执行该脚本:2)配合使用ignore_ ...

  2. RocketMQ入门到入土(二)事务消息&顺序消息

    接上一篇:RocketMQ入门到入土(一)新手也能看懂的原理和实战! 一.事务消息的由来 1.案例 引用官方的购物案例: 小明购买一个100元的东西,账户扣款100元的同时需要保证在下游的积分系统给小 ...

  3. Hexo结合Stun静态博客搭建从入门到入土

    摘要 安装npm,安装hexo相关依赖,安装主题stun 修改hexo配置,修改stun配置,部署到github,gitee实现静态访问 给博客加上全局搜索,访问量统计 hexo博客编写模板 tips ...

  4. QT从入门到入土(一)——Qt5.14.2安装教程和VS2019环境配置

    引言 24岁的某天,承载着周围人的关心,一路南下.天晴心静,听着斑马,不免对未来有些彷徨.但是呢,人生总要走陌生的路,看陌生的风景,所幸可以听着不变的歌,关心自己的人就那么多.就像是对庸常生活的一次越 ...

  5. QT从入门到入土(二)——对象模型(对象树)和窗口坐标体系

    摘要 我们使用的标准 C++,其设计的对象模型虽然已经提供了非常高效的 RTTI 支持,但是在某些方面还是不够灵活.比如在 GUI 编程方面,既需要高效的运行效率也需要强大的灵活性,诸如删除某窗口时可 ...

  6. QT从入门到入土(三)——信号和槽机制

    摘要 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号 (signal).这种发出是没有目的的,类似广播 ...

  7. QT从入门到入土(四)——多线程(QtConcurrent::run())

    引言 在前面对Qt多线程(QThread)做了详细的分析:QT从入门到入土(四)--多线程(QThread) - 唯有自己强大 - 博客园 (cnblogs.com) 但是最近在做项目时候,要将一个函 ...

  8. Swoole 中毫秒定时器(Timer)的使用

    间隔定时器, tick 定时器会持续触发,直到调用 clear() 清除为止. $timer = Swoole\Timer::tick(3000, function (int $timer_id, $ ...

  9. [Swoole系列入门教程 4] 定时器与心跳demo

  10. VS2010/MFC编程入门之四十四:定时器Timer

    前面一节鸡啄米讲了CTime类和CTimeSpan类的使用,本节继续讲与时间有关的定时器.定时器并不是一个类,主要考虑到,提起时间的话就不能不说定时器,所以就把它放到CTime和CTimeSpan之后 ...

随机推荐

  1. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.27)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...

  2. [转帖]Linux中查看各文件夹大小命令du -h --max-depth=1

    https://www.cnblogs.com/the-tops/p/8798678.html 最近排查服务器异常的时候,常会遇到磁盘慢的情况,这个时候,查找那个文件夹占用的内存的时候常用到这个命令: ...

  3. [转帖]Jmeter正则提取器常用的几种方式

    https://www.cnblogs.com/a00ium/p/10483741.html 使用jmeter的同学都知道,jmeter提供了各种各样的提取器,如jsonpath.Beanshell. ...

  4. [转帖]kafka漏洞升级记录,基于SASL JAAS 配置和 SASL 协议,涉及版本3.4以下

    攻击者可以使用基于 SASL JAAS 配置和 SASL 协议的任意 Kafka 客户端,在对 Kafka Connect worker 创建或修改连接器时,通过构造特殊的配置,进行 JNDI 注入. ...

  5. 多个物理磁盘挂载到同一目录的方法 (lvm 软raid)

    多个物理磁盘挂载到同一目录的方法 (lvm 软raid) 背景 公司里面的一台申威3231的机器 因为这个机器的raid卡没有操作界面. 所以只能够通过命令行方式创建raid 自己这一块比较菜, 想着 ...

  6. [转帖]Redis核心技术与实战

    https://www.cnblogs.com/strick/p/14851429.html 最近在读一篇关于Redis的专栏,叫做<Redis核心技术与实战>,作者在Redis方面研究颇 ...

  7. [转帖]kubernetes calico网络

    https://plantegg.github.io/2022/01/19/kubernetes%20calico%E7%BD%91%E7%BB%9C/ cni 网络 cni0 is a Linux ...

  8. Redis 菜鸟进阶

    Redis 菜鸟进阶 背景 最近产品一直要优化性能,加强高可用. 有一个课题是Redis高可用与性能调优. 我这边其实获取到的内容很有限. 最近济南疫情严重,自己锁骨骨折. 然后通勤时间基本上都用来查 ...

  9. Mysql 查看varchar和char类型表的列长度

    SELECT table_name, SUM(character_maximum_length) AS sum_length FROM information_schema.columns WHERE ...

  10. Gin 框架之jwt 介绍与基本使用

    目录 一.JWT 介绍 二.JWT认证与session认证的区别 2.1 基于session认证流程图 2.2 基于jwt认证流程图 三. JWT 的构成 3.1 header : 头部 3.2 pa ...