每个程序员都应该知道的Swoole知识

白癜风该怎么治 http://m.39.net/pf/a_4443995.html

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

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

01PHP本身的定时器介绍

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

pcntl_alarm(intseconds):int

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

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

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

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

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

02Swoole中定时器的使用方法

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

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

intSwoole\Timer::tick(intmsec,callablecallback,……params);

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

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

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

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

intSwoole\Timer::after(intafter_time_ms,callablecallback_function,……params);

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

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

functionTimer::set(arrayarray);//设置定时器的参数Timer\IteratorTimer::list();//返回定时器迭代器,可使用foreach遍历全局所有timer的idarrayTimer::info(intid);//返回timer的信息boolSwoole\Timer::clear(inttimer_id);//使用定时器ID来删除定时器boolTimer::clearAll();//清除当前工作进程内的所有定时器

03Swoole定时器的底层原理

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

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




转载请注明:http://www.xxcyfilter.com/zyfl/zyfl/17282.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了