存储视频观看记录明细___面向动作的编程思想
一. 项目中,为了对视频网站节目的观看明细做出各种统计,需要维护一份每个视频每个用户的观看详情:即用户从观看开始点,结束点,拖曳点,等。
以上为需求。
二.前端
一个视频节目从打开到关闭,最多会有四种动作发生:
1开始(开始播放):事件(参数:开始时间)
2暂停(暂停):事件(参数:开始时间)
3拖曳(从当前向前或向后拖动):事件(参数:拖曳动作起始时间,拖曳至时间)
4停止(从当前停止播放,跳转到最开始):事件(参数:停止时间)
播放器代码如下:
//拖曳:传拖曳起点,终点时间 function onSeek(second){ $.post('index.php?r=video/videorecordseek', { fromtime:parseInt(window.Player.playTime()), totime:second }); } //暂停:传暂停时间 function onSwitchInPauseSate(){ $.post('index.php?r=video/videorecordpause', { time:parseInt(window.Player.playTime()) }); } //停止:传停止时间 function onStop(){ $.post('index.php?r=video/videorecordstop', { time:parseInt(window.Player.playTime()) }); } //开始:传开始时间 function onStart(){ $.post('index.php?r=video/videorecordstart', { time:parseInt(window.Player.playTime()) }); }
三. 后台数据存储表设计
创建视频存储记录数据表VideoDetail。包括视频号,用户号,记录开始时间,记录时长,记录结束原因,sessionkey等。
下面按代码来注释具体4种动作的前置和后置动作可能及处理。
四 .后台代码
//开始播放 //开始播放之前无论是什么动作,均执行新增一条记录的操作 public function actionVideorecordstart() { $starttime=$_POST['time']; $session=Yii::$app->session; $session->open(); $datenow=time(); //新生成一个缓存的KEY $sessionkey=$sessionid.$videoid.$userid.$datenow; $session['videotime']=$sessionkey; if ((!isset($session['videotimetype']))||($session['videotimetype']!='start')) { //如果type不存在或者值不为开始,则置为开始 $session['videotimetype']='start'; //新生成一条记录 $model=new VideoDetail(); model->userid=$userid; $model->starttime=$starttime; $model->videoid=$videoid; $model->timecreated=date('y-m-d H:i:s',time()); $model->sessionkey=$sessionkey; $model->save(); } } //停止播放 //停止播放之前无论是什么动作,都结束一条播放记录,且结束原因为1 public function actionVideorecordstop() { $stoptime=$_POST['time']; $session=Yii::$app->session; $session->open(); //如果type存在且值为开始,则结束一条播放记录 if ((isset($session['videotimetype'])&&($session['videotimetype']=='start'))) { $sessionkey=$session['videotime']; $session['videotimetype']='stop'; $model=VideoDetail::findOne(['sessionkey'=>$sessionkey]); $model->updateAttributes(['endtime'=>$stoptime, 'time'=>$tool->typeofsecond($stoptime-$model->starttime), 'endreason'=>1, ]); } } //暂停 //暂停播放之前如果是播放,结束一条播放记录,且结束原因为2 public function actionVideorecordpause() { $pausetime=$_POST['time']; $session=Yii::$app->session; $session->open(); //暂停之前正在播放 if ((isset($session['videotimetype'])&&($session['videotimetype']=='start'))) { $sessionkey=$session['videotime']; $session['videotimetype']='pause'; $model=VideoDetail::findOne(['sessionkey'=>$sessionkey]); $model->updateAttributes(['endtime'=>$pausetime, 'time'=>$tool->typeofsecond($pausetime-$model->starttime), 'endreason'=>2, ]); } } //暂停 public function actionVideorecordseek() { $fromtime=$_POST['fromtime']; $totime=$_POST['totime']; $session=Yii::$app->session; $session->open(); $datenow=time(); //拖曳之前正在播放,则结束一条记录,结束原因为3,并新增一条新的记录 if ((isset($session['videotimetype'])&&($session['videotimetype']=='start'))) { $sessionkey=$session['videotime']; $session['videotimetype']='start'; $model=VideoDetail::findOne(['sessionkey'=>$sessionkey]); $model->updateAttributes(['endtime'=>$fromtime 'time'=>$fromtime-$model->starttime, 'endreason'=>3, ]); $sessionkeynew=$sessionid.$videoid.$userid.$datenow; $session['videotime']=$sessionkeynew; $model=new VideoDetail(); $model->userid=$userid; $model->starttime=$tool->typeofsecond($totime); $model->videoid=$videoid; $model->timecreated=date('y-m-d H:i:s',time()); $model->sessionkey=$sessionkeynew; $model->save(); } //拖曳之前正在暂停,保持暂停状态 //if ((isset($session['videotimetype'])&&($session['videotimetype']=='pause'))) //{ // $session['videotimetype']='pause'; //} //拖曳之前正在停止,拖曳之后可能为播放或者暂停状态,(播放器不稳定,数据统计时不计入结束时间为null的) if ((isset($session['videotimetype'])&&($session['videotimetype']=='stop'))) { $session['videotimetype']='start'; $sessionkeystart=$sessionid.$videoid.$userid.$datenow; $session['videotime']=$sessionkeystart; $model=new VideoDetail(); $model->userid=$userid; $model->starttime=$totime; $model->videoid=$videoid; $model->timecreated=date('y-m-d H:i:s',time()); $model->sessionkey=$sessionkeystart; $model->save(); } }