设置定时器

swoole提供了类似JavaScript的setInterval/setTimeout异步高精度定时器,粒度为毫秒级。使用也非常简单。

程序代码

//每隔2000ms触发一次
swoole_timer_tick(2000, function ($timer_id) {
    echo "tick-2000ms\n";
});

//3000ms后执行此函数
swoole_timer_after(3000, function () {
    echo "after 3000ms.\n";
});
  • swoole_timer_tick函数就相当于setInterval,是持续触发的
  • swoole_timer_after函数相当于setTimeout,仅在约定的时间触发一次
  • swoole_timer_tickswoole_timer_after函数会返回一个整数,表示定时器的ID
  • 可以使用 swoole_timer_clear 清除此定时器,参数为定时器ID

  • King

    关于该定时器: 如果没有在swoole_server中,只使用该方法: swoole_timer_tick 没有任何问题 但如果使用了该定时器, 并且后面有一个while 这时候...定时器就失效了! 为什么呢?

  • 陈镇海

    这定时器是怎用的??? 为啥我写了感觉没在执行啊

  • Rango-韩天峰

    死循环无法跳出任何代码都无法执行了。

  • King

    好, 谢谢

  • 小马哥

    为什么我在 : $server->on('WorkerStart', function ($server, $worker_id) { if ($worker_id == 1) { swoole_timer_tick(2000, function ($timer_id) { echo "tick-2000ms\n"; }); } });

    报错呢,也不能使用task 函数

  • 小马哥

    补充:版本是1.7.19

  • tb

    哪位给上个addtime的例子,这不会用啊。谢谢~

  • 王红岩

    能不能给出一个完整的例子啊,如何使用定时器功能啊

  • swoole_stu

    swoole, 已经编译通过了,在php -m 中可以看到swoole 模块,但是执行php timer.php,时,还是报PHP Fatal error: Call to undefined function swoole_timer_add() ,why?

  • 羊毛先生

    韩哥,想问个无关框架的问题,我们准备开发视频弹幕功能,服务端推弹幕到客户端这个应该怎么触发呢,用定时脚本或者你这里的定时器吗

  • 蝶恋花

    //3000秒后执行此函数 swoole_timer_after(3000, function () { echo "after 3000ms.\n" }); 少了一个分号

  • 蝶恋花

    这个不用定时器让服务器端定时推送给客户端吧,使用websock通讯,服务端主动拉取弹幕信息

  • 羊毛先生

    嗯,已经用了TCP+WEBSOCKET分别用于APP和H5的推拉信息

  • 李本富

    <?php //每隔2000ms触发一次 $num = 0; $timer = swoole_timer_tick(2000, function ($timer_id) { global $num; $num++; echo "tick-2000ms $num\n"; }); //3000秒后执行此函数 swoole_timer_after(5000, function () { global $timer; swoole_timer_clear($timer); echo "after 5000ms.\n"; }); 测试ok

  • 小小大成

    是5000ms不是3000秒后执行swoole_timer_clear(),笔误吧,文中注释一节。

  • 小小大成

    韩,文中所说

    //3000秒后执行此函数 swoole_timer_after(3000, function () { echo "after 3000ms.\n" });

    应为3000ms。