当前位置: 代码迷 >> 综合 >> swoole Timer 毫秒定时器
  详细解决方案

swoole Timer 毫秒定时器

热度:34   发布时间:2023-12-15 02:21:17.0

定时器的原理:

 

 定时器在实际的开发中非常常用,列如crontab就是一个非常常用的定时器,可以在指定的时间执行规定的任务,PHP本身也提pcntl_alarm,通过模拟时钟信号实现定时器,不过这些定时器都有一个缺点,不能精确到毫秒,还有比如执行一个任务,在某些特定的场合想关闭定时器,传统的php也实现不了这些功能。而swoole 弥补了这些缺点。

swoole 的 swoole_timer模块提供了一个毫秒定时器,swoole_timer是基于timerfd+epoll实现的异步毫秒定时器,可完美的运行在EventLoop中,与swoole_client/swoole_event等模块可以无缝结合。

 

定时器的使用:

  在swoole 的定时器分为两种:一种是长类型的定时器tick,这种定时器一旦被创建,就会按照一定的时间执行任务,除非清除定时器,而另外一种定时器 after是临时定时器,这个定时器仅仅只运作一次,在指定的时间内响应一次,就会自动清除。

 

1、tick 定时器

    创建一个 tick  定时器的原型 如下:

int swoole_timer_tick(int $ms, mixed $callback, mixed $param = null);
int swoole_server::tick(int $ms, mixed $callback, mixed $param = null);

 

回调函数的原型如下所示: php function onTimer(int $timer_id, mixed $params = null); 第一个参数是响应的timer_id,对应调用tick函数返回的id;第二个参数是调用tick时传入的第三个参数的值。我们可以用这个param参数传递一些公共参数进去(因为这个参数一旦给定,就不能在后续的逻辑中改变了)。另外,也可以使用PHP的闭包(use关键字)实现传参。具体实例如下:

 

参数名	参数说明
$ms	定时器的间隔,单位是ms
$callback	回调函数,定时器响应后执行此函数
$param	用户自定义参数,会被传递给callback回调

 

 

tick函数会返回定时器的id。当我们不再需要某个定时器的时候,可以根据这个id,调用swoole_timer_clear函数删除定时器。

 

 

2、after 定时器

 创建一个 after 定时器的原型 如下:

 

int swoole_timer_after(int $after_time_ms, mixed $callback_function, mixed $user_param);

回调函数的原型如下所示:

function onTimer() // 回调函数的原型,不接受任何参数

after定时器的回调函数不接受任何参数,可以通过闭包方式传递参数,也可以通过类成员变量的方式传递。具体实例如下:

class Test
{private $str = "Say Hello";public function onAfter(){echo $this->str; // 输出”Say Hello“}
}$test = new Test();
swoole_timer_after(1000, array($test, "onAfter"); // 成员变量swoole_timer_after(2000, function() use($test){ // 闭包$test->onAfter(); // 输出”Say Hello“
});


after定时器适用于某些延后执行的操作,比如用户创建了一个订单需要在5分钟后检查这个订单是否被支付等。这些任务往往需要在间隔一定时间后执行,并且只需要执行一次,就可以直接使用after来实现了。

 

 

 

  相关解决方案