swoole_server->tick [编辑本页]

tick定时器,可以自定义回调函数。此函数是swoole_timer_tick的别名。

worker进程结束运行后,所有定时器都会自动销毁
tick/after定时器不能在swoole_server->start之前使用

在onReceive中使用

function onReceive($server, $fd, $from_id, $data) {
    $server->tick(1000, function() use ($server, $fd) {
        $server->send($fd, "hello world");
    });
}

在onWorkerStart中使用

  • 低于1.8.0版本task进程不能使用tick/after定时器,所以需要使用$serv->taskworker进行判断
  • task进程可以使用addtimer间隔定时器
function onWorkerStart(swoole_server $serv, $worker_id)
{
    if (!$serv->taskworker) {
        $serv->tick(1000, function ($id) {
            var_dump($id);
        });
    }
    else
    {
        $serv->addtimer(1000);
    }
}

  • ikool

    请问 tick和addtimer 什么区别啊?

  • durenox

    http://wiki.swoole.com/wiki/page/412.html add会被tick取代

  • Dean

    什么版本支持

  • train

    怎么在tick里面读取动态变化的类属性 比如说server->connections 呢?

  • 鬼眼

    只能写在onWorkerStart里面,如果是worker_num=4,那这个定时器就会同时执行4次。。我只想执行一次啊。咋搞。 写在外面不执行。

  • 王江明

    我为每个work设置了1秒的定时器,每个work会定时执行一些网络IO的操作,当某个work 执行失败后,当前work的定时器就会失效

  • zijianer

    tick写到onMasterStart里,在主进程里只执行一次的

  • 王南

    根据work_id投递定时器, 用取模法. 要注意排除掉taskworker

  • 蝶恋花

    function onReceive($server, $fd, $from_id, $data) { $server->tick(1000, function() use ($server, $fd) { foreach( server->connections as $con){ $server->send($con, "hello world"); } }); }

  • 蝶恋花

    写一个变量保存是否已经执行了tick

  • 蝶恋花

    你怎么知道投发到哪个work_id.

  • 蝶恋花

    tick定时器,可以自定义回调函数。此函数是swoole_timer_tick的别名。可以使用swoole_timer_tick执行定时任务,swoole_timer_tick会返回一个定时器ID,在onWorkerStart里面判断一下定时器ID就可以执行一次了

  • smallbaby

    搞懂了一个:$serv->tick(1000, function($id){}); $id 是定时器的id,从1开始,一直累加.

  • 古月扌高

    怎么让回调函数立即执行呀?而不是等一段时间再跑

  • 冰雪残冬

    onWorkerStart里加一行判断 if ($serv->worker_id == 0) $sever->tick()

  • 鬼眼

    已经晓得了多谢。