popQueue($key); if($userRedis){ $num = $userRedis['num']; $userId = $userRedis['user_id']; $recordSource = $userRedis['pk_type']; $pkUserInfo = M('User')->where(array('user_id'=>$userId,))->field('user_id,user_status')->find(); if (!in_array($pkUserInfo['user_status'], array(0,4,5))){ return FALSE; } } $uid = $this->getSocketOnline($userId,$recordSource); if ($uid==-1){ return false; } if (!$uid){ if ($num<10){ $this->pushQueue($key,array('user_id'=>$userId,'num'=>$num+1, 'pk_type'=>$recordSource)); } }else { if ($uid<=0){ return false; } //添加匹配记录 $recordId = M('PkRecord')->add(array('user_id'=>$userId,'ref_user_id'=>$uid,'record_source'=>$recordSource,'record_status'=>2,'peer_source'=>2,'operate_dt'=>time())); M('User')->where(array('user_id'=>array('IN',array($userId,$uid))))->save(array('user_status'=>2)); //如果是好友获取昵称 $userNick = array($userId=>'',$uid=>''); if ($userId>$uid){ $friendInfo =M('Friend')->where(array('user_id'=>$uid,'ref_user_id'=>$userId))->field('user_id,ref_user_id,user_nickname,ref_user_nickname')->find(); if ($friendInfo!=NULL){ $userNick = array($userId=>$friendInfo['ref_user_nickname'],$uid=>$friendInfo['user_nickname']); } }else{ $friendInfo =M('Friend')->where(array('user_id'=>$userId,'ref_user_id'=>$uid))->field('user_id,ref_user_id,user_nickname,ref_user_nickname')->find(); if ($friendInfo!=NULL){ $userNick = array($userId=>$friendInfo['ref_user_nickname'],$uid=>$friendInfo['user_nickname']); } } $join = ' u LEFT JOIN t_user_level ul ON u.user_level=ul.level_id'; $field = 'user_id,user_name,user_level,user_sex,user_icon,ul.level_name,1 as user_nickname'; $userInfoArr = M('User')->join($join)->where(array('user_id'=>array('IN',array($userId,$uid))))->field($field)->select(); foreach ($userInfoArr as $userInfo){ if ($userInfo['user_id']==$userId){ $userInfo['user_nickname'] = $userNick[$userId]; $returnData = array('record_id'=>$recordId,'user_id'=>$userId,'ref_user_id'=>$uid,'peer_info'=>$userInfo); $dataSoc = array('code'=>0,'type'=>16,'msg'=>'已匹配上,请准备开始对战!','data'=>$returnData); $pushUid = $this->pushMsg(json_encode($dataSoc), $uid); //不在线 if ($pushUid){ $this->offline($pushUid, $returnData); } }else{ $userInfo['user_nickname'] = $userNick[$uid]; $returnData = array('record_id'=>$recordId,'user_id'=>$userId,'ref_user_id'=>$uid,'peer_info'=>$userInfo); $dataSoc = array('code'=>0,'type'=>16,'msg'=>'已匹配上,请准备开始对战!','data'=>$returnData); $pushUid = $this->pushMsg(json_encode($dataSoc), $userId); //不在线 if ($pushUid){ $this->offline($pushUid, $returnData); } } } } } public function aa(){ //$this->flushQueue(); $res = $this->online(); $userIdArr = array_keys($res); $info = M('User')->where(array('user_id'=>array('IN',implode(',', $userIdArr))))->field('user_id,user_status')->select(); $this->ajaxReturn($info); } /* public function bb(){ M('User')->where(array('user_id'=>array('GT',0)))->save(array('user_status'=>0)); M('PkRecord')->where(array('record_id'=>array('GT',0)))->delete(); } public function cc(){ $msg = I('msg'); $uid = I('uid'); if (empty($uid)){ $this->pushMsg($msg); }else{ $this->pushMsg($msg,$uid); } } */ //获取在线好友 private function getSocketOnline($userId,$recordSource){ $res = $this->online(); if(empty($res)){ return FALSE; } if (!isset($res[$userId])){ return -1; } unset($res[$userId]); $userIdArr = array_keys($res); if (empty($userIdArr)){ return FALSE; } $redis = $this->getRedis(); if ($recordSource==2){ $userInfo = M('User')->where(array('user_id'=>$userId))->field('user_level')->find(); } foreach ($userIdArr as $uid){ $uidLock = $this->get($uid); if ($uidLock){ continue; }else{ $redis->set($uid,1,3); } if ($recordSource==2){ $peerInfo = M('User')->where(array('user_id'=>$uid,'user_level'=>$userInfo['user_level'],'user_status'=>array('IN','0,4,5')))->field('user_id')->find(); }else{ $peerInfo = M('User')->where(array('user_id'=>$uid,'user_status'=>array('IN','0,4,5')))->field('user_id')->find(); } if ($peerInfo != NULL){ M('User')->where(array('user_id'=>$peerInfo['user_id'],))->save(array('user_status'=>2)); break; } } if ($peerInfo == NULL){ return FALSE; }else{ return $peerInfo['user_id']; } } //获取在线好友 private function getSocketOnlineOld($userId){ $res = $this->online(); if(empty($res)){ return FALSE; } if (!isset($res[$userId])){ return -1; } unset($res[$userId]); $userIdArr = array_keys($res); if (empty($userIdArr)){ return FALSE; } $chunkUserId = array_chunk($userIdArr,200); $userInfo = M('User')->where(array('user_id'=>$userId))->field('user_level')->find(); foreach ($chunkUserId as $userIdRow){ $peerInfo = M('User')->where(array('user_id'=>array('IN',implode(',', $userIdRow)),'user_level'=>$userInfo['user_level'],'user_status'=>array('IN','0,4,5')))->field('user_id')->find(); if ($peerInfo != NULL){ M('User')->where(array('user_id'=>$peerInfo['user_id'],))->save(array('user_status'=>2)); break; } } if ($peerInfo == NULL){ return FALSE; }else{ return $peerInfo['user_id']; } } }