workerman如何依次间隔10秒把指令发给客户端,指令是变量,起始指令表示0001,结束指令0005,我如何在timer定时器中灵活运用变量。

人世几回伤往事

大家好,希望大家能帮我分析一下。workerman如何依次间隔10秒把指令发给客户端,指令是变量包括起始指令与结束指令,我如何在timer定时器中灵活运用变量。举例说明,我这有5个指令, 分别是 0001,0002,0003,0004,0005我打算把这五个指令依次间隔10秒发给客户端,我把定时器写for循环里面,所有指令会同一时间发给客户端,会造成丢数据和叠包,这不是我想要的。我用到了sleep,但是这也不是我想要的。我该怎么做比较好呀?或者大家有没有别的好办法呀?

2093 1 0
1个回答

six

几个定时器就搞定了啊

Timer::add(10, function() use ($connection) {
    $connection->send('0001');
}, [], false);
Timer::add(20, function() use ($connection) {
    $connection->send('0002');
}, [], false);
Timer::add(30, function() use ($connection) {
    $connection->send('0003');
}, [], false);
Timer::add(40, function() use ($connection) {
    $connection->send('0004');
}, [], false);
Timer::add(50, function() use ($connection) {
    $connection->send('0005');
}, [], false);
  • 人世几回伤往事 2020-06-11

    大佬,您好,事情是这么回事,但我如何不用for循环,依次找出这几个变量呀?我只知道起始变量0001,结束变量0005,另外三个变量是每次递增1得到的呀。

  • six 2020-06-11

    上面就是没用for循环啊

  • 人世几回伤往事 2020-06-12

    大佬您好:但是我的指令数是不固定的 ,有可能是5位,有可能7位,有可能是不同的两位数,我不可能每次都写死指令吧。目前有三个变量,就是$length=5,$start=0001,$end=0005,0001到0005依次递增1,直到$end==0005,最后一次发送。

  • six 2020-06-12

    for($i=1;$i<=5;$i++) {
    Timer::add(10*$i, function() use ($connection, $i) {
    $connection->send('000' . $i);
    }, [], false);
    }

  • 人世几回伤往事 2020-06-12

    大佬您好,只要用for循环就会同时发给客户端的。我想到了用引用变量的方式,正在尝试, 希望在send函数中能递增1,当等于0005后,停止调用。 不知道大佬在引用变量方便有啥好的建议。【抱拳】

    class Mail
    {
    // 注意,回调函数属性必须是public
    public function send($to, $content)
    {
    echo "send mail ...\n";
    }
    }

    $task = new Worker();
    $task->onWorkerStart = function($task)
    {
    // 10秒后发送一次邮件
    $mail = new Mail();
    $to = 'workerman@workerman.net';
    $content = 'hello workerman';
    Timer::add(10, array($mail, 'send'), array($to, $content), false);
    };
    // 运行worker
    Worker::runAll();

  • six 2020-06-12

    上面的for循环代码不会同时发送。

  • 人世几回伤往事 2020-06-12

    大佬您好 您的时间不是同时发送,但是用for的话,会把指令同时输出的呀

  • six 2020-06-12

    我for代码里没有输出,只有发送

  • 人世几回伤往事 2020-06-12

    哦哦 我试一试 呀 感激大佬【抱拳】

  • 人世几回伤往事 2020-06-12

    大佬 您的方案 我试过了 可是依然不行呀 我只能发送一个指令给客户端后,收到客户端返回的消息并把客户端返回的消息存入数据库,存入成功后再发下一条指令啦,依次发到0005,然后停止发送。关于我这个新想法,大佬有啥建议吗?

  • six 2020-06-12

    你这逻辑咋又变了,业务逻辑自己想吧,没时间一点一点教你

  • 人世几回伤往事 2020-06-12

    好的 好的 谢谢大佬

年代过于久远,无法发表回答
🔝