頁面平均停留時間統計


前段時間做了一個頁面停留時間的功能,用於統計客戶在當前頁面停留時間的統計,以方便統計用戶喜歡瀏覽什么樣的商品。

主要用到 php+redis心跳,代碼僅為大家提供一下思路,如下。

數據庫字段

mark    ->標識 varchar 
hashid   ->hashid varchar 
seconds  -> 停留時間 int 
nums     -> 當前頁面停留的總人數 int
members  -> 會員id

****************************開始****************************************

//統計停留時間方法

public function record()
{
    $params = $this->process_resttime();  //參數驗證
    $this->redis = new Redis();
    $key = 'resttime:' . $params['mark'] . ':' . $params['hashid'] . ':' . $params['member_id'];
    $max_seconds = $this->redis_get($key);
    //頁面最大停留時間記錄為180s,超過則不統計,去除用戶頁面停留后人不在一直統計情況
    if ($max_seconds > 175) {
        return 180;
    }
    return $redis->redis_incrby($key, 5);//每5秒統計一次
}

//redis存入時間數據
private redis_incrby($key,$value){
    if(!$key || !$value){
        return false;
    }
    if(!Redis::exists($key)){
        $this->redis->set($key,0);
    }
    return $this->redis->incrby($key,5);
}
//獲取停留時間,判斷是否超過最大停留時間限制
private function redis_get($key = [])
{
    if (!$key) {
        return false;
    }
    
    return$this->redis->get($key);} 



//活動標識跟活動 hashid來確定唯一的一個頁面
//duration 前端輪詢時間間隔
//member_id 會員id

private function process_resttime()
{
$this->validateRequest([
'duration' => 'required|numeric',
'mark' => 'required|alpha_dash',
'hashid' => 'required|alpha_dash',
'member_id' => 'required|alpha_dash',
], [
'duration' => '輪詢時間',
'mark' => '活動標識',
'hashid' => '活動hashid',
'member_id' => '會員id',
]);
return [
'duration' => intval($this->input['duration']),
'mark' => trim($this->input['mark']),
'hashid' => trim($this->input['hashid']),
'member_id' => trim($this->input['member_id']),
];
}



***************************統計結束********************************

//獲取統計數據
*****************************獲取停留時間***************************
public function get_times(){
$this->validateRequest([
'mark' => 'required|alpha_dash',
'hashid' => 'required|alpha_dash',
], [
'mark' => '活動標識',
'hashid' => '活動hashid',
]);
$key = 'resttime:'.$this->input['mark'].':'.$this->input['hashid'];
$this->redis = new Redis();
$keys = $this->redis->redis_keys($key);
$average_times = $this->process_times($keys);
return $average_times ? ['times'=>$average_times] : 0;
}
private function redis_keys($key = []){
if (!$key) {
return false;
}
$this->_init_redis();
return $this->redis->keys($key.'*');
}

private function process_times($keys){
if($keys && is_array($keys)){
$datas = $this->redis->redis_mget($keys);
$times = array_sum($datas);
$members = $this->get_members($keys);//獲取會員id數組
$raw_data = [
'mark' => $this->input['mark'],
'hashid' => $this->input['hashid'],
'seconds'=> $times ? intval($times) : 0,
'nums' => $keys ? count($keys) :0 ,
'members'=> $members ? serialize($members) :'' ,
];
$id = Resttime::insertGetId($raw_data);
if($id){
//取出緩存,刪除原先緩存數據
$this->redis->redis_del($keys);
}
}
$seconds = Resttime::where(['mark'=>$this->input['mark'],'hashid'=>$this->input['hashid']])->sum('seconds');//獲取該活動總停留秒數
$data = Resttime::select('members')->where(['mark'=>$this->input['mark'],'hashid'=>$this->input['hashid']])->get()->toArray();
$nums = $this->process_nums($data);//獲取活動會員數,剔除重復的會員
$average_times = number_format($seconds/$nums,2);
return $average_times ? :0;
}

private function redis_mget($key = []){
if (!$key) {
return false;
}
return $this->redis->mget($key);
}

//處理會員人數,防止重復統計
private function get_members($keys){
foreach ($keys as $oo){
$members[] = explode(':',$oo)['3'];
}
return $members ? :'';
}

private function redis_del($key = ''){
if (!$key) {
return false;
}
return $this->redis->del($key);
}

private function process_nums($data){
$datas = [];
if($data && is_array($data)) {
foreach ($data as $key => $vo){
$datas[] = $vo['members'] ? unserialize($vo['members']) :[];
}
}
$result = array_reduce($datas, 'array_merge', []);
$nums = count(array_unique($result));
return $nums ? :1;
}
*******************************************結束***********************************************

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM