转自:http://www.mafutian.net/63.html
-
function get_count($model='pageview',$field='addtimestamp',$cachename='count'){
-
-
/* 将之前的所有访问记录做缓存,缓存1年的时间,一次即可 */
-
$m = M($model);
-
$cache = S($model);
-
if(!$cache){
-
$cache = $m->field($field)->order('id asc')->select();
-
S($model,$cache,86400*366);
-
}
-
-
// 最早一次访问当天0点0分0秒的时间戳
-
$earliest = strtotime($cache[0][$field]);
-
$earliest = strtotime(date('Y-m-d 00:00:00',$earliest));
-
-
// 今天0点0分0秒的时间戳
-
$today = strtotime(date('Y-m-d 00:00:00'));
-
$days = ceil(($today - $earliest)/86400);
-
-
/* 每天的访问统计缓存 */
-
$count = S($cachename);
-
if(!$count){
-
-
// 获取每一次访问的日期是第几天(最早一次访问的日期是第一天)
-
foreach($cache as $k => $v){
-
$v['time']=strtotime($v[$field]);
-
$day = ceil(($v['time']-$earliest)/86400);
-
$arr[]['num'] = $day;
-
}
-
-
// 获取从第一天至今天期间每天的访问总数
-
$count = array();
-
foreach($arr as $k => $v){
-
for($i = 1;$i < $days;$i++){
-
$date = date('Y-m-d',$earliest+($i-1)*86400);
-
if($v['num']==$i){
-
$count[$date]++;
-
}
-
if(!$count[$date]){
-
$count[$date]=0;
-
}
-
}
-
}
-
S($cachename,$count,84600*366);
-
}
-
-
// 把昨天的访问总数加入缓存中
-
if($count && $days == (count($count)+1) ){
-
$yesterday_count = $m->where($field.' like "'.date('Y-m-').(date('d')-1).'%" ')->count();
-
$count[date('Y-m-').(date('d')-1)]=(int)$yesterday_count;
-
S($cachename,$count,86400*366);
-
}
-
/* 今天实时的访问数,没有加入缓存中 */
-
$today_count = $m->where($field.' like "'.date('Y-m-d').'%" ')->count();
-
$count[date('Y-m-d')] = (int)$today_count;
-
return $count;
-
-
}
主要的思路是:如果第一次没有做过缓存,则第一次的时候将所有数据库中存储的访问记录做一个缓存,有效期设置为1年,当第二次打开就不需要再次访问数据库了,然后在从刚刚做的缓存中,统计出每日所访问的总数(不含今天的,因为今天的统计量是实时的),并保存到数组$count中,然后再次保存到缓存中,最好就是自动更新的操作了,做一个判断,如果第二天了,就需要把第一天的统计量加到缓存中。这就是思路,如果有什么不明白的地方,可以在下面评论中留下疑问。