关于“如何在php后端及时推送消息给客户端”文章的疑问

蜗牛

http://wenda.workerman.net/?/question/508 这篇文章中,$inner_text_worker怎么知道$worker->onMessage里面的数据是否接收成功呢。意思就是$worker->onMessage已经取到硬件返回的信息,那$inner_text_worker如何得到返回的值,而且$worker = new Worker('websocket://0.0.0.0:1234'); 和$inner_text_worker = new Worker('Text://0.0.0.0:5678');监听的是不同的端口,它们是异步通信的吧。

阅读 1615
7个回答

walkor

$worker = new Worker('websocket://0.0.0.0:1234');和$inner_text_worker = new Worker('Text://0.0.0.0:5678');监听的是不同的端口,但是是同一个进程,同一个进程间全局变量是可以互相访问的,例如uid到连接对象的映射($worker->uidConnections)

  • 暂无评论
蜗牛
$worker->onWorkerStart = function($worker)
{
    $inner_text_worker = new Worker('Text://0.0.0.0:5678');
     $inner_text_worker->onMessage = function($connection, $buffer)use($worker)
     {
        global $worker;
        $data = json_decode($buffer, true);
        $uid = $data;
        $buffer = $data;
        $ret = sendMessageByUid($uid, $buffer);
        // $connection->send($ret ? 'ok' : 'fail');
        $connection->send($worker->data);//但发觉只能是第一次获取到数据,后面都是空的了。
     };
     $inner_text_worker->listen();
};
$worker->onConnect = function($connection)
{
    echo "new connection from ip " . $connection->getRemoteIp() . "\n";
};
$worker->uidConnections = array();
$worker->onMessage = function($connection, $data)use($worker)
{
     if(!isset($connection->uid))
     {
        $connection->uid = $data;
        $worker->uidConnections = $connection;
        return;
     }
     $worker->data = $data;//添加一个属性
};

而且 $inner_text_worker = new Worker('Text://0.0.0.0:5678');第一次发送数据到$worker = new Worker('Text://0.0.0.0:1234');的时候$worker->data也是为空的,这样也不符合要求。

  • 暂无评论
蜗牛

还有如果是多设备的情况,会不会有部分设备不能接收到数据呢?谢谢!

  • 暂无评论
walkor

不会

  • 暂无评论
蜗牛

那么$inner_text_worker如何能及时的收到$worker->onMessage里面发过来的数据呢?

  • 暂无评论
walkor

$inner_text_worker不会收到$worker->onMessage发来的数据,但是$worker->onMessage收到的数据可以转发给$inner_text_worker的连接。同样的,反过来也可以。
这个例子实际上就是$inner_text_worker->onMessage收到的数据转发给了$worker的连接,也就是转发给了websocket的连接。

  • 暂无评论
蜗牛

还请老大在代码上指点一二,谢谢。

  • 暂无评论