initialize(); } /** * 当客户端连接时触发 * 如果业务不需此回调可以删除onConnect * * @param int $client_id 连接id */ public static function onConnect($client_id) { // 向当前client_id发送数据 $data['client_id'] = $client_id; $data['type'] = 'init';//心跳 Gateway::sendToClient($client_id, json_encode($data)); } /** * 当客户端发来消息时触发 * @param int $client_id 连接id * @param mixed $message 具体消息 */ public static function onMessage($client_id, $message) { $data = json_decode($message, 1); $to = !empty($data['to_user_id']) ? 'user_' . $data['to_user_id'] : 0; $from_id = 'user_' . $data['user_id']; if ($data['type'] == 'bind') { // 绑定client_id和user_id Gateway::bindUid($client_id, $from_id); } else if ($data['type'] == 'ping') { //心跳 $data['Online'] = $to && Gateway::isUidOnline($to) ? 'off' : 'on'; Gateway::sendToUid($from_id, json_encode($data)); } else if ($data['type'] == 'close') { //断开链接 Gateway::unbindUid($client_id, $from_id); } else if ($data['type'] == 'read') { // 消息已读处理 $chatModel = new BusinessChatModel(); $chatModel->markAsRead($data['chat_id'], $data['user_id']); // 更新参与者最后阅读时间 $participantModel = new BusinessParticipantModel(); $participantModel->updateLastReadTime($data['conversation_id'], $data['user_id']); if ($to && Gateway::isUidOnline($to)) { Gateway::sendToUid($to, json_encode($data)); } } else if ($data['type'] !== 'ping' && $data['type'] !== 'close') {//正常发送消息 // 绑定client_id和user_id Gateway::bindUid($client_id, $from_id); // 保存消息到数据库 $Chat = new BusinessChatModel; $Chat->sendMessage($data['conversation_id'], $data['user_id'], $data['content'], 0, $data['app_id']); // 检查接收方是否在线 if ($to && Gateway::isUidOnline($to)) { $data['send_time'] = time(); $data['chat_id']=$Chat->chat_id; Gateway::sendToUid($to, json_encode($data)); } } } /** * 当用户断开连接时触发 * @param int $client_id 连接id */ public static function onClose($client_id) { // 向所有人发送 //GateWay::sendToAll("$client_id logout\r\n"); } }