PHPsocket.io中使用定时器

大王
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use Workerman\Lib\Timer;
use PHPSocketIO\SocketIO;

$io = new SocketIO(81);
// 当有客户端连接时
$io->on('connection', function($socket)use($io){
    // 获取链行股价行情事件回调函数
    $socket->on('get_price', function($msg)use($io){
        // 一个定时器,每x秒执行一次
        $time_interval = 7;
        Timer::add($time_interval, function(){
            global $io,$socket;
            //链接redis
            $redis_host = "127.0.0.1";
            $redis_port = 6379;
            $redis = new Redis();//使用phpredis(比predis性能好)
            $res = $redis->connect($redis_host, $redis_port);
            if($res){
                $rs = $redis->get("lhang_ticker");
                $data = json_decode($rs,true);
            }
            $io->emit('send_prices', $data);
        });
    });

});
Worker::runAll();

这样写,好像每个用户链接后发送get_price都会新增了一个定时器(不确定是不是,自己测试的时候打开多个页面,客户端接收的数据有时候一下子返回多个)。。有什么办法可以让所有用户只共用一个定时器吗?

3276 2 0
2个回答

walkor

在$io->on('workerStart', function(){});里添加定时器,也就是在进程启动后后添加,这样就是一个

  • zwc2004 2018-11-15

    具体是怎么添加呢,$io->emit('send_prices', $data)添加在什么地方呢

大王

感谢walkor回答!

  • zwc2004 2018-11-15

    我也遇到你说的客户端接收的数据有时候一下子返回多个,但是回答的“在$io->on('workerStart', function(){});里添加定时器”没看懂呀,能贴代码出来吗,感谢

  • 大王 2018-12-24

    @4963:$io->on('workerStart', function(){Timer::add(1, function(){echo 1;});});

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