public static function onMessage($client_id, $message) { // 获取客户端请求 $message_data = json_decode($message, true); echo 'message' . $message . 'ID' . $client_id; if (!$message_data) { return; } //text-info 是系统发送的。text-user 是其他用户发送的。 switch ($message_data['type']) { case 'JOIN': // 转播给所有用户 Gateway::sendToAll(json_encode(array('type' => 'NOTE', 'id' => $client_id, 'text_type' => 'text-info', 'msg' => $message_data['user_nickname'] . '加入聊天。当前共有' . count(Gateway::getOnlineStatus()) . '把剪子在线。'))); break; case 'QUIT': // 转播给所有用户 GateWay::sendToAll(json_encode(array('type' => 'QUIT', 'msg' => $message_data['from'] . '退出聊天啦 T^T'), true)); break; case 'EDIT': // 转播给所有用户 Gateway::sendToAll(json_encode(array('type' => 'EDIT', 'from' => $message_data['from'], 'to' => $message_data['to'], 'head' => $message_data['head']))); break; case 'NAME': // var_export(Gateway::getOnlineStatus()); // echo 'online num :'.count(Gateway::getOnlineStatus()); $id = mt_rand(1, 9); Gateway::sendToCurrentClient('{"type":"NAME","head":"http://img3.178.com/acg1/201507/230072993522/230073874484.jpg","name":"剪纸' . $client_id . '号","msg":"大家好,剪纸' . $client_id . '号来啦。"}'); echo 'NAME IS come '; break; // 更新用户 // 更新用户 case 'POST': // 转播给所有用户 echo 'POST IS IN'; Gateway::sendToAll(json_encode(array('type' => 'POST', 'from' => $message_data['from'], 'msg' => $message_data['context'], 'head' => $message_data['head']))); return; // 聊天 // 聊天 case 'message': // 向大家说 $new_message = array('type' => 'message', 'id' => $client_id, 'message' => $message_data['message']); return Gateway::sendToAll(json_encode($new_message)); } }
/** * 添加到客户端列表中 * @param int $client_id * @param string $client_name */ public static function addClientToRoom($room_id, $client_id, $client_name) { $key = "ROOM_CLIENT_LIST-{$room_id}"; $store = Store::instance('room'); // 获取所有所有房间的实际在线客户端列表,以便将存储中不在线用户删除 $all_online_client_id = Gateway::getOnlineStatus(); // 存储驱动是memcached if (get_class($store) == 'Memcached') { $cas = 0; $try_count = 3; while ($try_count--) { $client_list = $store->get($key, null, $cas); if (false === $client_list) { if ($store->getResultCode() == \Memcached::RES_NOTFOUND) { $client_list = array(); } else { throw new \Exception("Memcached->get({$key}) return false and memcache errcode:" . $store->getResultCode() . " errmsg:" . $store->getResultMessage()); } } if (!isset($client_list[$client_id])) { // 将存储中不在线用户删除 if ($all_online_client_id && $client_list) { $all_online_client_id = array_flip($all_online_client_id); $client_list = array_intersect_key($client_list, $all_online_client_id); } // 添加在线客户端 $client_list[$client_id] = $client_name; // 原子添加 if ($store->getResultCode() == \Memcached::RES_NOTFOUND) { $store->add($key, $client_list); } else { $store->cas($cas, $key, $client_list); } if ($store->getResultCode() == \Memcached::RES_SUCCESS) { return $client_list; } } else { return $client_list; } } throw new \Exception("addClientToRoom({$room_id}, {$client_id}, {$client_name})->cas({$cas}, {$key}, \$client_list) fail ." . $store->getResultMessage()); } else { $handler = fopen(__FILE__, 'r'); flock($handler, LOCK_EX); $client_list = $store->get($key); if (!isset($client_list[$client_id])) { // 将存储中不在线用户删除 if ($all_online_client_id && $client_list) { $all_online_client_id = array_flip($all_online_client_id); $client_list = array_intersect_key($client_list, $all_online_client_id); } // 添加在线客户端 $client_list[$client_id] = $client_name; $ret = $store->set($key, $client_list); flock($handler, LOCK_UN); return $client_list; } flock($handler, LOCK_UN); } return $client_list; }
/** * 存储用户到在线列表 * @param int $client_id * @param string $clientName */ public static function addUserToOnlineList($clientId, $clientName) { $key = Storekey::USER_ONLINE_LIST; // 获取所有所有在线用户clientid-------------- $allOnlineClientId = Gateway::getOnlineStatus(); //获取存储中在线用户列表 $clientList = Muser::getOnlineUsers(); if (isset($clientList[$clientId])) { return true; } //是否允许多用户登录,剔除用户的clientid if (\Config\St\Status::NOT_ALLOW_CLIENTS) { self::notAllowMoreClient($clientList, $clientName); } // 将存储中不在线用户删除 self::deleteOfflineUser($clientList, $allOnlineClientId); // 添加 时间默认是一天 if (RedisModel::hashSet('webChat', $key, $clientId, $clientName)) { return true; } return false; }