swoole定时器需在onworkerstart回调中启动,协程环境优先用swoole\coroutine\timer::tick;周期任务用swoole_timer_tick或协程tick,延时任务用swoole_timer_after;停用周期任务须调用swoole_timer_clear,避免内存泄漏。

需要让PHP服务在后台持续执行周期性或延时任务,比如每5秒检查一次数据库状态、30秒后重试失败的HTTP请求、每天凌晨清理缓存——Swoole定时器能直接嵌入服务进程完成这些操作,无需依赖系统Crontab或额外调度器。
启动定时器前必须确认的运行环境
定时器只能在Worker进程上下文中调用,【onWorkerStart回调里是唯一安全位置】。如果放在onStart、onManagerStart甚至全局作用域,函数会静默返回false且不报错,任务永远不会触发。
检查当前是否处于Worker进程:在onWorkerStart回调内部打印getmypid(),确保输出的是实际工作进程PID而非Master进程ID。
启用协程时优先选协程定时器:若swoole_http_server配置了enable_coroutine => true,就别用swoole_timer_tick,改用Swoole\Coroutine\Timer::tick,它不占timer_id池,也不受Worker数量限制。
设置周期性自动任务(如每秒心跳检测)
方法一:使用swoole_timer_tick创建毫秒级循环任务
第一步:在onWorkerStart中调用swoole_timer_tick(1000, function($timer_id) { ... }),第一个参数填毫秒数,比如1000代表每秒执行一次。
第二步:回调函数内写具体逻辑,例如file_get_contents('http://localhost:9501/health')检测接口存活,但【切勿在此处执行同步阻塞操作】,否则整个Worker事件循环会被卡住。
第三步:保存返回的$timer_id到类属性或全局变量,后续需手动清除时才能引用。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
方法二:协程环境下用Swoole\Coroutine\Timer::tick
直接调用Swoole\Coroutine\Timer::tick(1000, function() { echo "协程心跳\n"; });,返回协程ID,停用时用Swoole\Coroutine::cancel($cid)即可,无需管理ID生命周期。
设置单次延时自动任务(如3秒后发送告警)
swoole_timer_after(3000, function() { error_log("超时告警已发出"); }); 这行代码放在任意Worker上下文里都有效,3秒后只执行一次,自动销毁,不用手动clear。
注意:回调函数不接收任何参数,若需传参,必须用use关键字捕获外部变量,例如use($userId, $message)。
延时时间最大不能超过86400000毫秒(24小时),超出将被截断为该值。
安全停止正在运行的定时任务
调用swoole_timer_clear($timer_id)可立即终止对应周期性定时器;对swoole_timer_after创建的任务无效,它本就会自动结束。
务必在Worker进程退出前清理所有活跃定时器,否则timer_id持续累积会导致内存泄漏——每个未清除的定时器占用约128字节内存,长期运行的服务可能因此OOM。
推荐做法:把所有timer_id存进对象属性,在onWorkerStop回调中遍历并逐一swoole_timer_clear。










