簡體   English   中英

在splobjectstorage中查找數據

[英]looking up data in splobjectstorage

問候stackoverflow的人們,在過去的幾天里,我一直在看websockets和一個名為Ratchet的PHP庫(這是用PHP編寫websockets服務器應用程序的理想選擇)。 他們在Ratchet官方文檔中建議使用SplObjectStorage(我從未聽說過)來管理客戶端連接對象。

在大多數服務器應用程序中,您可能需要保留有關每個客戶端的一些數據(例如,在我嘗試編寫一個簡單的消息傳遞服務器的情況下,我需要保留諸如客戶端的昵稱之類的數據,也許還有其他內容),因此據我所知它可以在打開新連接時(如下所示)將客戶端對象和包含客戶端數據的數組添加到SplObjectStorage。

public function onOpen(ConnectionInterface $conn) {
    //$this->clients is the SplObjectStorage object
    $this->clients[$conn] = array('id' => $conn->resourceId, 'nickname' => '');

}

但是,我不確定通過數據數組中的值(例如通過用戶昵稱)從SplObjectStorage中獲取對象的最佳方法是什么,一種方法是這樣的:

//$this->clients is my SplObjectStorage object where I keep all incoming connections
foreach($this->clients as $client){ 
    $data = $this->clients->offsetGet($client);

    if($data['nickname'] == $NickNameIAmLookingFor){
        //Return the $client object or do something nice
    }
}

但是我認為這樣做有更好的方法,因此任何建議都將不勝感激。

提前致謝。

無需使用SplObjectStorage。 使clients成為以resourceId為鍵的數組,並對nicknames進行相同的操作。

// in __construct()
$this->clients = [];
$this->nicknames = [];

// in onOpen
$this->clients[$conn->resourceId] = $conn;
$this->nicknames[$conn->resourceId] = '';

然后您可以像這樣訪問它們

$this->clients[$conn->resourceId]
$this->nicknamees[$conn->resourceId]

您可以擁有更復雜的數組(也許您希望將它們全部放入單個嵌套數組中),但是解決方案在於使該數組的第一級鍵成為resourceId。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM