前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每个程序员都应该知道的 Swoole 知识 - 定时器

每个程序员都应该知道的 Swoole 知识 - 定时器

原创
作者头像
PHP开发工程师
修改2022-09-05 11:53:13
7020
修改2022-09-05 11:53:13
举报
文章被收录于专栏:thinkphp+vuethinkphp+vue

本节将讲述如下三个问题:

PHP 本身的定时器介绍 Swoole 中定时器的使用方法 Swoole 定时器的底层原理

1、PHP 本身的定时器介绍

先说说原生 PHP 如何实现定时器,PHP 的定时器是通过 pcntl_alarm 实现的:

pcntl_alarm ( int $seconds ) : int

pcntl_alarm 函数的作用是为进程设置一个 alarm 闹钟信号。调用这个方法后会创建一个计数器,在指定的秒数后向进程发送一个 SIGALRM 信号。每次对 pcntl_alarm 的调用都会取消之前设置的 alarm 信号。

其中,$seconds 为等待的秒数,如果 $seconds 设置为 0,将不会创建 alarm 信号。调用这个函数后返回上次 alarm 调度剩余的秒数,或者之前没有 alarm 调度时返回 0。

下面我们看一个例子,pcntl_signal () 函数安装信号处理器,pcntl_signal_dispatch () 调用等待信号的处理器。

pcntl_alarm () 函数是基于时钟信号 + tick 函数实现的,存在一些缺陷:

最大进支持到秒,而 Swoole Timer 可以到毫秒级别不支持同时设定多个定时器程序 pcntl_alarm () 依赖 declare (ticks = 1),性能很差

2、Swoole 中定时器的使用方法

Swoole 中的定时器可以达到毫秒精度,同时可以支持添加大量定时器。

在 Swoole 中可以使用 Timer::tick 来设置一个间隔时钟定时器,调用 Timer::clear 来清除定时器。函数定义如下:

int Swoole\Timer::tick(int $msec, callable $callback, ……$params);

这个函数的别名是 swoole_timer_tick ()。$msec 为指定的时间,单位是毫秒。$callback 为时间到期后执行的函数。$callback 回调函数会接收多个参数,第一个是定时器的 ID。注意:定时器仅在当前进程空间内有效。定时器是纯异步实现的,不能与阻塞 IO 的函数一起使用,否则定时器的执行时间会发生错乱。

下面是定时器在 websocket 的 onMessage 回调函数中的一个 demo,

触发 onMessage 回调后在客户端打印出如下信息,截图

除此之外 swoole 还提供了另外一个函数 Timer::after 来实现定时器,这个函数是的作用是在指定时间后执行回调函数。函数原型如下:

int Swoole\Timer::after(int $after_time_ms, callable $callback_function, ……$params);

这个函数的别名是 swoole_timer_after。Timer::after 是一个一次性定时器,执行完成后就会销毁。示例代码如下:

除了设置定时器的函数外,Swoole 还提供了另外几个函数:

function Timer::set (array $array); // 设置定时器的参数

Timer\Iterator Timer::list ();// 返回定时器迭代器,可使用 foreach 遍历全局所有

timer 的 idarray Timer::info (int $id);// 返回 timer 的信息

bool Swoole\Timer::clear (int $timer_id);// 使用定时器 ID 来删除定时器

bool Timer::clearAll ();// 清除当前工作进程内的所有定时器

3、Swoole 定时器的底层原理

Swoole 定时器底层是基于 epoll_wait 和 setitimer 实现,数据结构使用的是最小堆

Swoole 定时器回调函数的执行时间不影响下一次定时器执行的时间。如果定时器回调函数的执行时间过长,甚至覆盖了下一次定时器执行的时间。底层会进行时间校正,丢弃已过期的行为,在下一时间回调。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、PHP 本身的定时器介绍
  • 2、Swoole 中定时器的使用方法
  • 3、Swoole 定时器的底层原理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档