在平常的开发中,我们最常用的方式处理,是使用linux提供的crontab功能进行定时处理.但是很明显它有一个缺陷,那就是时间的粒度只能是分钟级别的,如果想使用秒级的就不行了,这个时候我们的基于swoole的毫秒定时器就可以很好的解决这个问题.
系统提供了三个函数供调用: swoole_timer_tick,swoole_timer_after,swoole_timer_clear
swoole_timer_tick:
设置一个间隔时钟定时器,与after定时器不同的是tick定时器会持续触发,直到调用swoole_timer_clear清除。
int swoole_timer_tick(int $msec, callable $callback);
$msec 指定时间,单位为毫秒。如1000表示1秒,最大不得超过 86400000
$callback_function 时间到期后所执行的函数,必须是可以调用的
可以使用匿名函数的use语法传递参数到回调函数中
定时器仅在当前进程空间内有效
定时器是纯异步实现的,不能与阻塞IO的函数一起使用,否则定时器的执行时间会发生错乱
定时器在执行的过程中可能存在一定误差
允许传递一个timer_id供时钟销毁使用
swoole_timer_after:
在指定的时间后执行函数,需要1.7.7或更高版本。
int swoole_timer_after(int $after_time_ms, mixed $callback_function);
swoole_timer_after函数是一个一次性定时器,执行完成后就会销毁。此函数与PHP标准库提供的sleep函数不同,after是非阻塞的。而sleep调用后会导致当前的进程进入阻塞,将无法处理新的请求。
执行成功返回定时器ID,若取消定时器,可调用 swoole_timer_clear
$after_time_ms 指定时间,单位为毫秒,最大不得超过 86400000
$callback_function 时间到期后所执行的函数,必须是可以调用的。
可以使用匿名函数的use语法传递参数到回调函数中
swoole_timer_clear:
使用定时器ID来删除定时器。
bool swoole_timer_clear(int $timer_id)
$timer_id,定时器ID,调用swoole_timer_tick、swoole_timer_after后会返回一个整数的ID
swoole_timer_clear不能用于清除其他进程的定时器,只作用于当前进程