标签:
直播基本Redis信息hash存储:[后台维护人员设置或者同步Redis]
// 同步活动信息到Redis public function synchronizeLive() { $liveId = ‘L00735‘; $redis = new \Redis(); $redis->connect(‘121.141.188.202‘, 63789); $setResult = $redis->hMset($liveId, [ ‘liveId‘ => $liveId, ‘expireTime‘ => -1, //过期时间设定 ‘isLive‘ => 1, //是否是直播,1.直播,0.非直播(历史回顾) ]); if($setResult == false ) exit(‘Hmset fail‘); exit(‘Hmset success‘); }
权限设置判断代码:
/** * 活动模板页面,权限请求处理 * 这个操作应该是客户端发起的请求,当客户点击播放按钮的时候,开始该活动的免费时间(10分钟)播放,到期立马关掉 */ public function checkAuth($liveId = ‘L00735‘, $clientId = ‘‘, $openId = ‘‘) { $redis = new \Redis(); $redis->connect(‘121.41.88.209‘, 63789); //检查是否是直播,还是历史回顾视频的观看 $isLive = $redis->hGet($liveId, ‘isLive‘); $clientIp = $this->getClientIp(); if ($isLive == 1) //是直播 ,则这时候就会根据客户端的IP来判断,同一个IP则不可以继续观看啦 { $watchTag = $redis->hGet($liveId . ‘:‘ . $clientIp, ‘watchTag‘); // 该值不存在,返回:false if ($watchTag == false) { // 没有看过的 //用户给自己设置过期时间 $expireTime = $redis->hGet($liveId, ‘expireTime‘); $redis->setex($liveId . ‘:‘ . $clientIp, $expireTime, $liveId . $expireTime); $redis->hMset($liveId . ‘:‘ . $clientIp, [ ‘liveId‘ => $liveId, ‘clientIp‘ => $clientIp, //客户端IP ‘clientId‘ => $clientId, //客户观看唯一id ‘watchTag‘ => 1, //观看标记:1.已经看过,0.一次都看过 ‘openId‘ => $openId, //微信用户唯一标识 ]); //JSON 返回信息 $message = [ ‘status‘ => 200, ‘liveId‘ => $liveId, ‘clientId‘ => $clientId, ‘watchTag‘ => 0, // 0 表示没有观看过 ‘isLive‘ => $isLive, // 是直播 ]; exit(json_encode($message)); // 您是第一来,可以观看的 } else { $redisIp = $redis->hGet($liveId . ‘:‘ . $clientIp, ‘clientIp‘); if ($clientIp == $redisIp && $watchTag == 1) { $message = [ ‘status‘ => 500, ‘liveId‘ => $liveId, ‘clientId‘ => $clientId, ‘watchTag‘ => 1, // 1 表示已经观看过了 ‘isLive‘ => $isLive, // 是直播 ]; exit(json_encode($message)); //不可以继续观看了 } } } else //不是直播,你可以继续观看,但是每次都是从头开始看哦 { $watchTag = $redis->hGet($liveId . ‘:‘ . $clientIp, ‘watchTag‘); // 该值不存在,返回:false if ($watchTag == false) // 您是第一来,可以观看的 { //用户给自己设置过期时间 $expireTime = $redis->hGet($liveId, ‘expireTime‘); $redis->setex($liveId . ‘:‘ . $clientIp, $expireTime, $liveId . $expireTime); $redis->hMset($liveId . ‘:‘ . $clientIp, [ ‘liveId‘ => $liveId, ‘clientIp‘ => $this->getClientIp(), //客户端IP ‘clientId‘ => $clientId, //客户观看唯一id ‘watchTag‘ => 1, //观看标记:1.已经看过,0.一次都看过 ‘openId‘ => $openId, //微信用户唯一标识 ]); //JSON 返回信息 $message = [ ‘status‘ => 200, ‘liveId‘ => $liveId, ‘clientId‘ => $clientId, ‘watchTag‘ => 0, // 1 表示已经观看过了 ‘isLive‘ => 0, // 是直播 ]; exit(json_encode($message)); } // 您是第二次来了,自己给自己重新设置过期时间,从头开始播放吧 $expireTime = $redis->hGet($liveId, ‘expireTime‘); $redis->setex($liveId . ‘:‘ . $clientIp, $expireTime, $liveId . $expireTime); $redis->hMset($liveId . ‘:‘ . $clientIp, [ ‘liveId‘ => $liveId, ‘clientIp‘ => $this->getClientIp(), //客户端IP ‘clientId‘ => $clientId, //客户观看唯一id ‘watchTag‘ => 1, //观看标记:1.已经看过,0.一次都看过 ‘openId‘ => $openId, //微信用户唯一标识 ]); //========================统计该用户看过的次数以及刷新次数========================== $redis->incr($liveId . ‘:‘ . $this->getClientIp()); //如果想知道用户在一年中每天的点击量,那么只要将用户 ID 以及相关的日期信息作为键 $redis->incr(date(‘Y-m-d‘) . ‘:‘ . $clientId); //========================统计该用户看过的次数以及刷新次数========================== $message = [ ‘status‘ => 200, ‘liveId‘ => $liveId, ‘clientId‘ => $clientId, ‘watchTag‘ => 1, // 1 表示已经观看过了 ‘isLive‘ => 0, // 是直播 ]; exit(json_encode($message)); // 您是第一来,可以观看的 } }
服务器API接口:
/** * 过期事件处理 * 这个是一个key过期之后要执行的一个Api接口,同时携带liveId参数过来 */ public function expireEvent() { $liveId = $_POST[‘liveId‘]; $redis = new \Redis(); $redis->connect(‘121.141.188.209‘, 63789); //活动模板页面的消息处理 $clientId = $redis->hGet($liveId, ‘clientId‘); $message = [ ‘liveId‘ => $liveId, ‘clientId‘ => $clientId, ‘watchTag‘ => 1, // 1 表示已经观看过了 ‘openId‘ => $redis->hGet($liveId, ‘openId‘), ]; Gateway::$registerAddress = ‘130.126.220.213:1238‘; Gateway::sendToClient($clientId, $message); $phone = ‘1366936*****‘; $code = rand(100000, 999999); $this->sendMessage($phone, $code); }
发送短信接口:
/** * @param $smsMob * @param $code * @return mixed|string * 短信接口 */ public function sendMessage($smsMob, $code) { $uId = "userName"; $key = "85fd6d7ab31231231214c557814df0"; $smsText = "你以为你干的这些事情没人知道?把你传网上去,看你还有什么脸,回复验证码:" . $code . ",自己看"; $url = ‘http://utf8.sms.webchinese.cn/?Uid=‘ . $uId . ‘&Key=‘ . $key . ‘&smsMob=‘ . $smsMob . ‘&smsText=‘ . $smsText; if (function_exists(‘file_get_contents‘)) { $file_contents = file_get_contents($url); } else { $ch = curl_init(); $timeout = 5; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); $file_contents = curl_exec($ch); curl_close($ch); } return $file_contents; }
获取客户端IP地址:
/** * 获取客户端IP */ public function getClientIp() { $ip = ‘unknown‘; $unknown = ‘unknown‘; if (isset($_SERVER[‘HTTP_X_FORWARDED_FOR‘]) && $_SERVER[‘HTTP_X_FORWARDED_FOR‘] && strcasecmp($_SERVER[‘HTTP_X_FORWARDED_FOR‘], $unknown)) { // 使用透明代理、欺骗性代理的情况 $ip = $_SERVER[‘HTTP_X_FORWARDED_FOR‘]; } elseif (isset($_SERVER[‘REMOTE_ADDR‘]) && $_SERVER[‘REMOTE_ADDR‘] && strcasecmp($_SERVER[‘REMOTE_ADDR‘], $unknown)) { // 没有代理、使用普通匿名代理和高匿代理的情况 $ip = $_SERVER[‘REMOTE_ADDR‘]; } // 处理多层代理的情况 if (strpos($ip, ‘,‘) !== false) { // 输出第一个IP $ip = reset(explode(‘,‘, $ip)); } return $ip; }
待续.....
参考地址:
Redis实践操作之—— 直播视频定时控制【TCP长连接框架(WorkerMan)+键空间通知的机制 ( Keyspace Notifications)+短信接口(API)】
标签:
原文地址:http://www.cnblogs.com/tinywan/p/5906256.html