[英]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.