一次性发邮件用Timer::after(5000, fn() => sendEmail()),5秒后执行且自动销毁;周期性检测数据库连接用Timer::tick(3000, fn($id) => checkDbConnection()),必须保存ID并在适当时机调用Timer::clear($id)清除,否则内存泄漏。

你需要在Swoole项目中安排一个5秒后发邮件的任务,同时还要每3秒检查一次数据库连接是否存活——这两个需求不能混用同一个定时器类型,选错会导致任务只执行一次就消失,或永远停不下来。
一次性延迟任务必须用Timer::after
第一步:调用Swoole\Timer::after(5000, function() { sendEmail(); });,传入毫秒数和回调函数。
这一步不能用tick替代——【tick会反复触发,导致邮件被重复发送】。after执行完自动销毁,ID也不返回,你根本没法、也不需要去清理它。
如果回调里抛出未捕获异常,任务仍会执行一次然后退出,不会卡住整个事件循环。
周期性轮询任务必须用Timer::tick
方法一:直接使用$id = Swoole\Timer::tick(3000, function($timer_id) { checkDbConnection(); });。
方法二:用匿名函数带参数传递上下文:$config = ['host' => '127.0.0.1']; Swoole\Timer::tick(3000, function($timer_id, $cfg) { ping($cfg['host']); }, $config);。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
【必须保存返回的$id,否则无法停止该定时器】。忘记clear会导致进程常驻内存泄漏,且下次重启时旧定时器仍在运行。
清除tick定时器的正确操作路径
① 保存tick返回的整数ID:$heartbeatId = Swoole\Timer::tick(1000, fn() => echo "alive");
② 在连接断开或服务关闭前,显式调用Swoole\Timer::clear($heartbeatId);
③ 清除后再次调用Swoole\Timer::clear($heartbeatId)会返回false,不会报错,但无实际作用。
注意:after定时器没有ID可清除,强行传参调用clear会静默失败,不会触发任何警告。

















