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

转自:http://www.mafutian.net/63.html

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

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值