【问题标题】:Is it possible to store additional variables in a ratchet connection是否可以在棘轮连接中存储其他变量
【发布时间】:2015-03-24 12:49:00
【问题描述】:

这是我的onMessage

public function onMessage(ConnectionInterface $from, $msg) {
    $tempMessage = json_decode($msg, TRUE);
    if ($tempMessage['type'] == 'online') {
        foreach ($this->clients as $client) {
            if ($client == $from) {
                echo "client " . $from->resourceId . "(" . $from->remoteAddress . ") is online\n";
            }
        }
    }

}

是否可以将值保存在此 $client 对象中以供以后参考?

我知道可以为此保留一个数组,但它可能会变得复杂 正如文档中我将客户端存储在SplObjectStorage

【问题讨论】:

    标签: php websocket ratchet


    【解决方案1】:

    通用方式

    如果您查看\SplObjectStoragephp documentation,您会看到您可以向对象添加信息,因此根据您的代码,您可以像这样添加数据

    $this->clients[$from]->setInfo(['myData' => 'foo']);
    

    然后像这样检索它

    $data   = $this->clients[$from]->getInfo();
    var_dump($data); // $data = ['myData' => 'foo']
    }
    

    简单/快捷的方式

    免责声明: 这只是为了在 onOpen 中设置数据(例如:cookie),之后每次都克隆连接以传递给 onMessage 使原始连接不可变,这就是为什么我不推荐这个解决方案来设置与原始连接无关的数据,因为它可能导致难以调试的错误

    由于连接是一个 php 类,您可以添加属性 只要该财产尚未被定义为受保护或 私人的

    在客户端类的源代码中(在 \Ratchet\AbstractConnectionDecorator) 你会发现

    public function __set($name, $value) {
        $this->wrappedConn->$name = $value;
    }
    
    public function __get($name) {
        return $this->wrappedConn->$name;
    }
    

    意味着该类只是 \React\Socket\Connection 的包装器 没有 setter/getter。

    因此您可以像在对象上一样操作属性

    $client->myData = $data;
    var_dump($client->myData);
    

    另一种方式

    与其将客户端存储在 \SplObjectStorage 中,不如将它们存储在键控数组中并使用 spl_object_hash 生成键

    PS:这已经是 SplObjectStorage 底层发生的事情,所以这是在重新发明轮子

    /**
     * @var array[]
     */
    protected $clients = [];
    
    public function onOpen( ConnectionInterface $conn ) {
        $this->clients[spl_object_hash( $conn )] = [ 'connection' => $conn, 'myData' => "My data" ];
    }
    
    public function onMessage( ConnectionInterface $conn, $msg ) {
        $myData = $this->clients[spl_object_hash( $conn )]['myData'];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-12
      • 2012-04-04
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      相关资源
      最近更新 更多