user->identity->username) ? Yii::$app->user->identity->username : '0'; $data = array('uid'=> $uid, 'msg'=>urlencode('嗯,这个是测试用的')); // 发送数据,注意该端口是Text协议的端口,Text协议需要在数据末尾加上换行符 fwrite($client, json_encode($data)."\n"); // 读取推送结果 // echo '$client=='.$client; //echo fread($client, 8192); } /** * 向客户端推送消息 */ public function actionOut() { global $_FM; //数据取出方法 $dataGet = $_FM['get']; //GET进来的参数 $dataPost = $_FM['post']; //POST进来的参数 $params = Yii::$app->params; header('Access-Control-Allow-Origin:*'); //允许指定网站通过ajax发送请求 require dirname(__FILE__).'/_public/plat.php'; $group_pre = 'XCX-HOFC'; /*设置REDIS缓存*/ //初始化$cache = new \Redis(); $cache = new \Redis(); $cache->connect($params['redis']['IP'], $params['redis']['PORT']); // 先检查是否存在,然后写入并设置有效时间 $key = 'FmWebSorcketCount'; $CACHE_PREFIX = 'DACMS'; $count = 0; if($cache->exists($CACHE_PREFIX.$key)){ // 读取 $count = $cache->get($CACHE_PREFIX . $key); //清除 $cache->delete($CACHE_PREFIX . $key); } $cache->set($CACHE_PREFIX . $key, $count+1); $expire = time()+604800; //一周时间再过期 $cache->expire($CACHE_PREFIX . $key, $expire); //前台已经建立起长链接,取得了客户端ID号;需要绑定到当前用户,并返回用户uid,供服务侧同步绑定校验 $viaDomain = fmFunc_server_via_domain(); //来路域名 $viaIP = fmFunc_server_via_ip(); //来路IP $timestamp = isset($_FM['timestamp']) ? $_FM['timestamp'] : time(); //通过前端GET传入的 $client_id = isset($dataGet['client_id']) ? $dataGet['client_id'] : '7f000001b0f400000010'; //处理POST数据 $client_type = isset($dataPost['client_type']) ? $dataPost['client_type'] : ''; $msg_type = isset($dataPost['msg_type']) ? $dataPost['msg_type'] : ''; if(!$msg_type){ $msg_type = isset($dataGet['msg_type']) ? $dataGet['msg_type'] : ''; } $msg = isset($dataPost['msg']) ? $dataPost['msg'] : ''; if(!$msg){ $msg = isset($dataGet['msg']) ? $dataGet['msg'] : ''; } //构造反馈消息 $data = array(); $data['type'] = $msg_type; $data['msg'] = $msg; if(isset($dataGet['debug'])){ //向全体推送数据 $data['msg'] = empty($data['msg']) ? '第'.$count.'次测试群发' : $data['msg']; $count++; $data = json_encode($data); Gateway::sendToAll($data); return; } $data = json_encode($data); //根据情况发送消息 switch($hasToken){ case true: //根据当前用户身份生成可准确识别的用户ID $uid = isset($dataPost['uid']) ? $dataPost['uid'] : ''; if($uid){ $uid = fmFunc_server_hash_id($uid); Gateway::sendToUid($uid, $data); } //有证书时,可继续下一步的推送 if(!$hasCert){ break; //无证书,不再继续 } //已指派分组时 $group_id = isset($dataPost['group']) ? $dataPost['group'] : 0; if($groud_id){ $group_id = $group_pre.fmFunc_server_hash_id($group_id); Gateway::sendToGroup($group_id, $data); break; //执行后结束此次推送 } if($client_type) { $group_id = $type; $group_id = $group_pre.fmFunc_server_hash_id($group_id); Gateway::sendToGroup($group_id, $data); } break; case false; //只发送给指定客户端 Gateway::sendToClient($client_id, $data); break; } } /** * 接收客户端数据并向全部客户端群发 */ public function actionSend2all() { header('Access-Control-Allow-Origin:*'); //允许指定网站通过ajax发送请求 global $_FM; global $_HI; //数据取出方法 $dataGet = $_FM['get']; //GET进来的参数 $dataPost = $_FM['post']; //POST进来的参数 $params = Yii::$app->params; $group_pre = 'XCX-HOFC'; /*设置REDIS缓存*/ //初始化$cache = new \Redis(); $cache = new \Redis(); $cache->connect($params['redis']['IP'], $params['redis']['PORT']); // 先检查是否存在,然后写入并设置有效时间 $key = 'FmWebSorcketCount'; $CACHE_PREFIX = 'DACMS'; $count = 0; if($cache->exists($CACHE_PREFIX.$key)){ // 读取 $count = $cache->get($CACHE_PREFIX . $key); //清除 $cache->delete($CACHE_PREFIX . $key); } $cache->set($CACHE_PREFIX . $key, $count+1); $expire = time()+604800; //一周时间再过期 $cache->expire($CACHE_PREFIX . $key, $expire); //前台已经建立起长链接,取得了客户端ID号;需要绑定到当前用户,并返回用户uid,供服务侧同步绑定校验 $viaDomain = fmFunc_server_via_domain(); //来路域名 $viaIP = fmFunc_server_via_ip(); //来路IP $timestamp = isset($_FM['timestamp']) ? $_FM['timestamp'] : time(); //通过前端GET传入的 $client_id = isset($dataGet['client_id']) ? $dataGet['client_id'] : ' '; if(!$client_id){ return; } //处理POST数据 $msg_type = isset($dataPost['msg_type']) ? $dataPost['msg_type'] : ''; if(!$msg_type){ $msg_type = isset($dataGet['msg_type']) ? $dataGet['msg_type'] : ''; } $msg = isset($dataPost['msg']) ? $dataPost['msg'] : ''; if(!$msg){ $msg = isset($dataGet['msg']) ? $dataGet['msg'] : ''; } //构造反馈消息 $data = array(); $data['type'] = $msg_type; //消息反馈类型:alert,confirm,toast,content $data['msg'] = $msg; $data['status']=1; //消息状态 $data['avatar'] = isset($dataPost['avatar']) ? $dataPost['avatar'] : ''; $data['username'] = '管理员'; //昵称 $data['title'] = '系统提示'; //消息标题 $data['mid'] = isset($dataPost['mid']) ? $dataPost['mid'] : 1; //消息来源会员, -1为公众号本身 $time = time(); $data['id'] = isset($dataPost['id']) ? $dataPost['id'] :md5($time.'_'.$data['mid']); $data['ctype'] = isset($dataPost['type']) ? $dataPost['type'] : 0; //消息内容类型(-1,系统消息;-2表情;-3快捷表态;-4 红包;0,默认,文本消息;1图片;3音频; 4视频;) $data['createtime'] = $time; if(isset($dataGet['debug'])){ //向全体推送数据 $data['msg'] = empty($data['msg']) ? '第'.$count.'次测试群发' : $data['msg']; $count++; $data = json_encode($data); Gateway::sendToAll($data); return; } $data = json_encode($data); //向全体推送数据 //设定群发群组 $appid = isset($dataPost['appid']) ? $dataPost['appid'] : 0; $group_id = 'wxapp_'.$appid; $group_ids[$group_id] = $group_pre.fmFunc_server_hash_id($group_id); $count++; Gateway::sendToGroup($group_ids[$group_id], $data); //构造反馈消息 $data = array(); $data['type'] = 'toast'; $data['msg'] = '消息已发送'; $data = json_encode($data); //发送给指定客户端 Gateway::sendToClient($client_id, $data); return; } }