× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

设置定时器

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

  • 小马哥

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

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

  • 王红岩

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

  • swoole_stu

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

  • 羊毛先生

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

  • 蝶恋花

    这个不用定时器让服务器端定时推送给客户端吧,使用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

  • 饭尚稀

    跟js里面的定时器用法一样嘛。贴一段自己测试代码:客户端连接成功后,每隔3秒钟向客户端发送数据 function onOpen($ws,$request){ var_dump($request); echo "===============\r\n"; $ws->push($request->fd, "你好用户".$request->fd."我们将持续为您报时"); swoole_timer_tick(3000,function($timeId) use (&$ws,&$request){ var_dump($timeId); $ws->push($request->fd, "当前时间是:".date('y/m/d H:i:s')); }); }

  • 一场白雪

    不能再定时器中 用 协成吗 有了协成 就不执行了

  • dawn

    假如定时器间隔1000ms,定时器执行时间为2000ms,在下一次时间到来时,上一次任务还没有执行完。这时定时器是怎么处理的?终止当前执行的,从头开始执行吗?

  •   如水

    我想定时每天2点运行一个脚本,怎么写呢?

  • oyzyyzyo

    @如水 那你应该用cron啊,去搜搜 用这个也可以,你2点的时候执行脚本,设置时间间隔1天................

  • oyzyyzyo

    @dawn 试试,要等任务执行完,才会重新计数

  • 遖星苝斗

    laravel定时任务里怎么使用swoole定时器

  • 蛟十五

    实验ok

  • dengrijin

    很实用,弥补了cron不足。

  • 杰

    500错误

  • 黑大叔

    测试定时器直接报了这个错 Warning: swoole_event_wait(): Using Xdebug in coroutines is extremely dangerous, please notice that it may lead to coredump! in Unknown on line 0 卸载掉xdebug就好了,貌似不兼容

  • 海燃 天南

    运行很简单啊,直接保存成timer.php,然后cli:php timer.php就可以了。 如果要显示在web上,那么就要用websocket保持长连接,然后计时器每个一段时间推送消息。

  • henry

    123

  • henry

    //创建websocket服务器对象,监听0.0.0.0:9502端口
    $ws = new swoole_websocket_server("0.0.0.0", 9504);
    
    //监听WebSocket连接打开事件
    $ws->on('open', function ($ws, $request) {
        var_dump($request->fd, $request->get, $request->server);
        //每隔2000ms触发一次
        swoole_timer_tick(2000, function ($timer_id) use($ws, $request) {
           $ws->push($request->fd, "定时任务\n");
        });
        $ws->push($request->fd, "hello, welcome\n");
    });
    
    //监听WebSocket消息事件
    $ws->on('message', function ($ws, $frame) {
        echo "Message: {$frame->data}\n";
        $ws->push($frame->fd, "server: {$frame->data}");
    });
    
    //监听WebSocket连接关闭事件
    $ws->on('close', function ($ws, $fd) {
        echo "client-{$fd} is closed\n";
    });
    
    $ws->start();   
    

    socket使用例子