Timer::after用于一次性延迟执行,适合延迟操作如5秒后关闭连接,执行后自动销毁;Timer::tick用于周期性重复执行,适合心跳上报、定期清理等任务,需手动清除才能停止。两者共用事件循环,但生命周期不同:after自动释放,tick需调用clear停止。
Swoole的Timer::after
和Timer::tick
虽然都是用于定时任务,但它们在执行逻辑和使用场景上有本质区别。
Timer::after:一次性延迟执行
这个方法用于在指定毫秒后执行一次回调函数。它相当于设置一个“延时任务”,时间到了就触发一次,然后自动销毁。
- 只执行一次
- 适合做延迟操作,比如5秒后关闭连接、100ms后重试请求
- 底层基于最小堆管理定时器,到期后自动移除
示例:SwooleTimer::after(2000, function() { echo “2秒后执行”; });
Timer::tick:周期性重复执行
这个方法会每隔指定毫秒执行一次回调,属于周期性任务,除非手动清除,否则会一直运行。
- 反复执行,按固定间隔触发
- 适合做轮询、心跳上报、定期清理等持续性任务
- 每次触发后重新入堆,等待下一次调度
示例:SwooleTimer::tick(1000, function() { echo “每1秒执行一次”; });
本质上,after
是单次定时器,tick
是循环定时器。两者共用Swoole的全局事件循环,但生命周期管理不同:after
执行完自动释放ID,而tick
需调用clear
手动停止。
基本上就这些,用哪个取决于你要执行的任务是一次性的还是周期性的。