日度归档:2008年11月28日

简单网站统计功能的实现(PV IP 真实访客数)

主要统计三个数值,网站的pv 和ip 以及真实访客数 因为有详细的统计记录,所以可以实现的功能还有很大的扩展!把tallydate使用内存表的话,速度就会更快了

ss.jpg

需要用到二张表

 

SQL代码
  1. CREATE TABLE `tally` (   
  2.   `datedate NOT NULL,   
  3.   `pvtotal` int(10) NOT NULL,   
  4.   `iptotal` int(10) NOT NULL,   
  5.   `dltotal` int(10) NOT NULL,   
  6.   PRIMARY KEY  (`date`)   
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;   
  8.   
  9.   
  10.   
  11. CREATE TABLE `tallydata` (   
  12.   `tdid` int(10) NOT NULL auto_increment,   
  13.   `ip` int(10) NOT NULL,   
  14.   `cookie` varchar(32) NOT NULL,   
  15.   `datedate NOT NULL,   
  16.   `timeint(10) NOT NULL,   
  17.   `uri` varchar(255) default NULL,   
  18.   `referer` varchar(255) default NULL,   
  19.   PRIMARY KEY  (`tdid`)   
  20. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;   

 

统计的调用文件(用于所在统计的页面进行js调入):

(注:因项目使用的是ThinkPHP框架,所以贴出的只是代码片段!因为代码刚完成,所以没有做优化以及注释)

PHP代码
  1. <?php    
  2. class TallyAction extends Action{   
  3.     public function index(){   
  4.         if($_SERVER[‘SERVER_NAME’]!=‘fullyee.com’ && $_SERVER[‘SERVER_NAME’]!=‘www.fullyee.com’ && $_SERVER[‘SERVER_NAME’]!=‘company.fullyee.com’exit;   
  5.         $add[‘ip’]=ip2long(get_client_ip());   
  6.         if(!Cookie::is_set(‘fullyeetally’)){   
  7.             $value=md5(microtime().$add[‘ip’].rand());   
  8.                
  9.             $overTime=mktime(0,0,0,date(‘m’),date(‘d’)+1,date(‘Y’))-time();   
  10.             Cookie::set("fullyeetally",$value,time()+$overTime);   
  11.         }   
  12.         $fullyeetally=Cookie::get(‘fullyeetally’);   
  13.         $add[‘cookie’]=$fullyeetally;   
  14.         $add[‘date’]=date(‘Y-m-d’);   
  15.         $add[‘time’]=time();   
  16.         $add[‘uri’]=$_SERVER[‘SERVER_NAME’].$_SERVER[‘REQUEST_URI’];   
  17.         $add[‘referer’]=$_SERVER[‘HTTP_REFERER’];   
  18.         $tallydata_=D(‘Tallydata’);   
  19.         $tallydata_->create($add);   
  20.         $tallydata_->add();   
  21.            
  22.     }   
  23.   
  24.     public function saveData()   
  25.     {   
  26.         $tally_=D(‘Tally’);   
  27.         $tallydata_=D(‘Tallydata’);   
  28.         $nowDate=date(‘Y-m-d’,time()-3600*24);   
  29.   
  30.         $now[‘date’]=$nowDate;   
  31.         $now[‘iptotal’]=$this->gototal($nowDate,‘ip’);   
  32.         $now[‘pvtotal’]=$tallydata_->count(array(‘date’=>$nowDate),‘tdid’);   
  33.         $now[‘dltotal’]=$this->gototal($nowDate,‘cookie’);   
  34.   
  35.         if($tally=$tally_->find(array(‘date’=>$nowDate))){   
  36.             $tally_->save(array(‘iptotal’=>$now[‘iptotal’],‘pvtotal’=>$now[‘pvtotal’],‘dltotal’=>$now[‘dltotal’]),array(‘date’=>$nowDate));   
  37.         }else{   
  38.             $tally_->create($now);   
  39.             $tally_->add();   
  40.         }   
  41.         $timeDel=time()-3600*24*50;   
  42.         $tallydata_->query("delete from `tallydate` where `time`<$timeDel");   
  43.         echo ‘Success ‘+date(‘Y-m-d H:i:s’);   
  44.     }   
  45.   
  46.     function gototal($nowDate,$a)   
  47.     {   
  48.         $tallydata_=D(‘Tallydata’);   
  49.         $now[‘iptotal’]=$tallydata_->query("select count(distinct $a) from `tallydata` where `date`=’$nowDate’ ");   
  50.         return $now[‘iptotal’][0]["count(distinct $a)"];   
  51.     }   
  52. }    
  53. ?>  

程序中的 saveDate 部分,用于服务器的定时运行,最简单的方法就是用linux的crontab在一个访问人数比较少的时间wget一下saveDate代码就行了。。这段代码的作用是,把前一天的访问数据全部统计,以天为单位写入tally表!并且删除一定时间外的统计记录。默认是删除50天以前的全部统计记录

显示部分:

 

PHP代码
  1. <?php   
  2. class configAction extends Action{   
  3.     function _initialize(){   
  4.         header("Content-Type:text/html; charset=utf-8");   
  5.     }   
  6.        
  7.     public function tally()   
  8.     {   
  9.         $tally_=D(‘Tally’);   
  10.         $tallydata_=D(‘Tallydata’);   
  11.         $nowDate=date(‘Y-m-d’);   
  12.         $now[‘date’]=$nowDate;   
  13.         $now[‘iptotal’]=$this->gototal($nowDate,‘ip’);   
  14.         $now[‘pvtotal’]=$tallydata_->count(array(‘date’=>$nowDate),‘tdid’);   
  15.         $now[‘dltotal’]=$this->gototal($nowDate,‘cookie’);   
  16.            
  17.         if($tally=$tally_->find(array(‘date’=>$nowDate))){   
  18.             $tally_->save(array(‘iptotal’=>$now[‘iptotal’],‘pvtotal’=>$now[‘pvtotal’],‘dltotal’=>$now[‘dltotal’]),array(‘date’=>$nowDate));   
  19.         }else{   
  20.             $tally_->create($now);   
  21.             $tally_->add();   
  22.         }   
  23.         $today[‘pv’]=$now[‘pvtotal’];   
  24.         $today[‘ip’]=$now[‘iptotal’];   
  25.         $today[‘dl’]=$now[‘dltotal’];   
  26.         $yesterdayDate=date(‘Y-m-d’,time()-3600*24);   
  27.         //echo $yesterdayDate;   
  28.         $yesterday=$tally_->find(array(‘date’=>$yesterdayDate));   
  29.         //dump($yesterday);   
  30.         $yesterday[‘pv’]=isset($yesterday[‘pvtotal’])?$yesterday[‘pvtotal’]:‘0’;   
  31.         $yesterday[‘ip’]=isset($yesterday[‘iptotal’])?$yesterday[‘iptotal’]:‘0’;   
  32.         $yesterday[‘dl’]=isset($yesterday[‘dltotal’])?$yesterday[‘dltotal’]:‘0’;   
  33.   
  34.         $maxpv=$this->gomax(‘pvtotal’);   
  35.         $maxip=$this->gomax(‘iptotal’);   
  36.         $maxdl=$this->gomax(‘dltotal’);   
  37.         $max[‘pv’]=$maxpv[‘pvtotal’];   
  38.         $max[‘pvdate’]=$maxpv[‘date’];   
  39.         $max[‘ip’]=$maxip[‘iptotal’];   
  40.         $max[‘ipdate’]=$maxip[‘date’];   
  41.         $max[‘dl’]=$maxdl[‘dltotal’];   
  42.         $max[‘dldate’]=$maxdl[‘date’];     
  43.         $this->assign(‘today’,$today);   
  44.         $this->assign(‘yesterday’,$yesterday);   
  45.         $this->assign(‘max’,$max);   
  46.         $this->assign(‘nowtime’,date(‘Y年m月d日 H:i:s’));   
  47.         $this->display();   
  48.     }   
  49.     function gomax($a)   
  50.     {   
  51.         $tally_=D(‘Tally’);   
  52.         $max=$tally_->query("select * from `tally` order by `$a` desc limit 1");   
  53.         return $max[0];   
  54.     }   
  55.        
  56.     function gototal($nowDate,$a)   
  57.     {   
  58.         $tallydata_=D(‘Tallydata’);   
  59.         $now[‘iptotal’]=$tallydata_->query("select count(distinct $a) from `tallydata` where `date`=’$nowDate’ ");   
  60.         return $now[‘iptotal’][0]["count(distinct $a)"];   
  61.     }   
  62. }   
  63. ?>