通用方式
如果您查看\SplObjectStorage 的php 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'];
}