最新的2.0文檔里更新了Event.php,發(fā)現(xiàn)里面有各一個地方我不是很理解
// 轉(zhuǎn)播給當(dāng)前房間的所有客戶端,xx進入聊天室 message {type:login, client_id:xx, name:xx}
$new_message = array('type'=>$message_data, 'client_id'=>$client_id, 'client_name'=>htmlspecialchars($client_name), 'time'=>date('Y-m-d H:i:s'));
Gateway::sendToGroup($room_id, json_encode($new_message));
Gateway::joinGroup($client_id, $room_id);
// 給當(dāng)前用戶發(fā)送用戶列表
$new_message = $clients_list;
Gateway::sendToCurrentClient(json_encode($new_message));
請看 上面代碼,以上是在Event的 71行-78行的代碼,在這里的sendToCurrentClient(),為什么不用sendToGroup()?,你們看。既然是獲取當(dāng)前在線的用戶列表,那我已經(jīng)上線了,就已經(jīng)在當(dāng)前Group里面了,那為什么還要使用sendToCurrentClient()?用sendToGroup()的話,可以一起推送,這樣做反而可以減方便很多,你們說呢?所以我不是很理解!
謝謝!
兩個方法的作用
Gateway::sendToGroup是給某個用戶組(這里是房間)的用戶連接發(fā)送數(shù)據(jù)
Gateway::sendToCurrentClient是給當(dāng)前用戶連接發(fā)送數(shù)據(jù)。
用戶登錄數(shù)據(jù)交互流程
1、先給當(dāng)前房間所有在線用戶廣播(Gateway::sendToGroup)有人登錄,瀏覽器收到login數(shù)據(jù)后將新用戶展示到在線列表里面
2、給當(dāng)前登錄的用戶單獨放送(Gateway::sendToCurrentClient)在房間的線用戶列表
為什么當(dāng)前用戶要單獨發(fā)送?
因為當(dāng)前用戶有個在線用戶列表數(shù)據(jù)。而這個在線列表數(shù)據(jù)根本不需要發(fā)送給其它已經(jīng)在線的用戶,因為他們已經(jīng)有了這份在線列表數(shù)據(jù),只需要增量添加新用戶即可。
在線用戶列表占用的帶寬
在線用戶列表數(shù)據(jù)可能會很大。例如2000人在線,每個用戶記錄大概50字節(jié),那么這個列表體積可能在100KB左右。
如果這100KB數(shù)據(jù)廣播給所有2000在線用戶,那么將占用帶寬2000*100KB=200MB=1.6Gbit,沒錯,需要1.6G的帶寬。。。
如果是無差別的實時廣播所有在線用戶,2000人的聊天室每秒一次的用戶登錄/退出就輕松把帶寬耗光了。
結(jié)論
所以只給當(dāng)前用戶發(fā)送所有的在線用戶列表,其他已經(jīng)在線的用戶只需要更新那一個上線的用戶數(shù)據(jù)。
這就是為什么要分別發(fā)送。