如何在ThinkPHP下用缓存做每日访问量统计

学习笔记 马富天 2016-04-25 15:46:54 81 0

【摘要】今天我写了一个函数,在ThinkPHP下做访问量的统计。

话不多说,直接上代码:

  1.     function get_count($model='pageview',$field='addtimestamp',$cachename='count'){
  2.         /* 将之前的所有访问记录做缓存,缓存1年的时间,一次即可 */
  3.         $m = M($model);
  4.         $cache = S($model);        
  5.         if(!$cache){            
  6.             $cache = $m->field($field)->order('id asc')->select();
  7.             S($model,$cache,86400*366);
  8.         }        
  9.         //  最早一次访问当天0点0分0秒的时间戳
  10.         $earliest = strtotime($cache[0][$field]);
  11.         $earliest = strtotime(date('Y-m-d 00:00:00',$earliest));
  12.         //  今天0点0分0秒的时间戳
  13.         $today = strtotime(date('Y-m-d 00:00:00'));
  14.         $days = ceil(($today - $earliest)/86400);
  15.         /* 每天的访问统计缓存 */
  16.         $count = S($cachename);
  17.         if(!$count){
  18.             
  19.             //  获取每一次访问的日期是第几天(最早一次访问的日期是第一天)
  20.             foreach($cache as $k => $v){           
  21.                 $v['time']=strtotime($v[$field]);
  22.                 $day = ceil(($v['time']-$earliest)/86400);
  23.                 $arr[]['num'] = $day;
  24.             }
  25.             //  获取从第一天至今天期间每天的访问总数
  26.             $count = array();
  27.             foreach($arr as $k => $v){
  28.                 for($i = 1;$i < $days;$i++){
  29.                     $date = date('Y-m-d',$earliest+($i-1)*86400);
  30.                     if($v['num']==$i){                  
  31.                         $count[$date]++;
  32.                     }
  33.                     if(!$count[$date]){
  34.                         $count[$date]=0;
  35.                     }
  36.                 }
  37.             }
  38.             S($cachename,$count,84600*366);
  39.         }
  40.         //  把昨天的访问总数加入缓存中
  41.         if($count && $days == (count($count)+1) ){
  42.             $yesterday_count = $m->where($field.' like  "'.date('Y-m-').(date('d')-1).'%" ')->count();
  43.             $count[date('Y-m-').(date('d')-1)]=(int)$yesterday_count;
  44.             S($cachename,$count,86400*366);
  45.         }        
  46.         /* 今天实时的访问数,没有加入缓存中 */
  47.         $today_count = $m->where($field.' like  "'.date('Y-m-d').'%" ')->count();
  48.         $count[date('Y-m-d')] = (int)$today_count;
  49.         return $count;
  50.     }

主要的思路是:如果第一次没有做过缓存,则第一次的时候将所有数据库中存储的访问记录做一个缓存,有效期设置为1年,当第二次打开就不需要再次访问数据库了,然后在从刚刚做的缓存中,统计出每日所访问的总数(不含今天的,因为今天的统计量是实时的),并保存到数组$count中,然后再次保存到缓存中,最好就是自动更新的操作了,做一个判断,如果第二天了,就需要把第一天的统计量加到缓存中。这就是思路,如果有什么不明白的地方,可以在下面评论中留下疑问。

版权归 马富天PHP博客 所有

本文标题:《如何在ThinkPHP下用缓存做每日访问量统计》

本文链接地址:http://www.mafutian.net/63.html

转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^

6

1

上一篇《 Windows下如何配置Apache虚拟主机【基于主机名】 》 下一篇《 JavaScript中alert()方法重写 》
分享到:

暂无评论

评论审核未开启
表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情
验证码