怎么实现单一的查询,然后发送给所有人

chenyeyu

我的需求是每隔一段时间查询数据库,然后推送给所有人
代码类似如下:

while(true){

    $sql ="select 1+1";
    $count=$mysql->query($sql);
    Gateway::sendToAll(json_encode($count));
    sleep(1000);
}

我现在用websocket的onMessage来写这个的话,但是他是每个客户端连接上来都要开一份这个代码在运行。
如何才能实现只运行一个代码,所有客户都能接受到啊。。

4165 2 0
2个回答

chenyeyu

我试着在start_gateway写定时器,可惜使用sendToAll就报错。。

\Workerman\Lib\Timer::add(2, function() {
\GatewayWorker\Lib\Gateway::sendToAll('1111');
});

  • 暂无评论
walkor

gateway只管网络io,业务逻辑请在businessworker中写。

可以在businessworker->onWorkerStart里面写,如果只想在其中一个进程运行,就判断下$businessworker->id,比如只在$businessworker->id===0的进程中运行

打开start_businessworker.php
合适的位置加上

$businessworker->onWorkerStart = function($businessworker) {
    // 只在0号businessworker设置定时器
    if ($businessworker->id === 0) {
        \Workerman\Lib\Timer::add(2, function() {
        \GatewayWorker\Lib\Gateway::sendToAll('1111');
    });
    }
}
  • chenyeyu 2016-08-10

    哈哈。我刚弄得这个啊,在想如何只在一个进程中进行呢,你就告诉我答案了,谢谢老板

  • walkor 2016-08-10

    不客气

  • chenyeyu 2016-08-10

    顺便问下,在start_businessworker.php这里可以使用\GatewayWorker\Lib\Db吗

  • chenyeyu 2016-08-10

    看手册,好像是不允许

  • walkor 2016-08-10

    可以

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