主要统计三个数值,网站的pv 和ip 以及真实访客数 因为有详细的统计记录,所以可以实现的功能还有很大的扩展!把tallydate使用内存表的话,速度就会更快了
需要用到二张表
SQL代码
- CREATE TABLE `tally` (
- `date` date NOT NULL,
- `pvtotal` int(10) NOT NULL,
- `iptotal` int(10) NOT NULL,
- `dltotal` int(10) NOT NULL,
- PRIMARY KEY (`date`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- CREATE TABLE `tallydata` (
- `tdid` int(10) NOT NULL auto_increment,
- `ip` int(10) NOT NULL,
- `cookie` varchar(32) NOT NULL,
- `date` date NOT NULL,
- `time` int(10) NOT NULL,
- `uri` varchar(255) default NULL,
- `referer` varchar(255) default NULL,
- PRIMARY KEY (`tdid`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
统计的调用文件(用于所在统计的页面进行js调入):
(注:因项目使用的是ThinkPHP框架,所以贴出的只是代码片段!因为代码刚完成,所以没有做优化以及注释)
PHP代码
- <?php
- class TallyAction extends Action{
- public function index(){
- if($_SERVER[‘SERVER_NAME’]!=‘fullyee.com’ && $_SERVER[‘SERVER_NAME’]!=‘www.fullyee.com’ && $_SERVER[‘SERVER_NAME’]!=‘company.fullyee.com’) exit;
- $add[‘ip’]=ip2long(get_client_ip());
- if(!Cookie::is_set(‘fullyeetally’)){
- $value=md5(microtime().$add[‘ip’].rand());
- $overTime=mktime(0,0,0,date(‘m’),date(‘d’)+1,date(‘Y’))-time();
- Cookie::set("fullyeetally",$value,time()+$overTime);
- }
- $fullyeetally=Cookie::get(‘fullyeetally’);
- $add[‘cookie’]=$fullyeetally;
- $add[‘date’]=date(‘Y-m-d’);
- $add[‘time’]=time();
- $add[‘uri’]=$_SERVER[‘SERVER_NAME’].$_SERVER[‘REQUEST_URI’];
- $add[‘referer’]=$_SERVER[‘HTTP_REFERER’];
- $tallydata_=D(‘Tallydata’);
- $tallydata_->create($add);
- $tallydata_->add();
- }
- public function saveData()
- {
- $tally_=D(‘Tally’);
- $tallydata_=D(‘Tallydata’);
- $nowDate=date(‘Y-m-d’,time()-3600*24);
- $now[‘date’]=$nowDate;
- $now[‘iptotal’]=$this->gototal($nowDate,‘ip’);
- $now[‘pvtotal’]=$tallydata_->count(array(‘date’=>$nowDate),‘tdid’);
- $now[‘dltotal’]=$this->gototal($nowDate,‘cookie’);
- if($tally=$tally_->find(array(‘date’=>$nowDate))){
- $tally_->save(array(‘iptotal’=>$now[‘iptotal’],‘pvtotal’=>$now[‘pvtotal’],‘dltotal’=>$now[‘dltotal’]),array(‘date’=>$nowDate));
- }else{
- $tally_->create($now);
- $tally_->add();
- }
- $timeDel=time()-3600*24*50;
- $tallydata_->query("delete from `tallydate` where `time`<$timeDel");
- echo ‘Success ‘+date(‘Y-m-d H:i:s’);
- }
- function gototal($nowDate,$a)
- {
- $tallydata_=D(‘Tallydata’);
- $now[‘iptotal’]=$tallydata_->query("select count(distinct $a) from `tallydata` where `date`=’$nowDate’ ");
- return $now[‘iptotal’][0]["count(distinct $a)"];
- }
- }
- ?>
程序中的 saveDate 部分,用于服务器的定时运行,最简单的方法就是用linux的crontab在一个访问人数比较少的时间wget一下saveDate代码就行了。。这段代码的作用是,把前一天的访问数据全部统计,以天为单位写入tally表!并且删除一定时间外的统计记录。默认是删除50天以前的全部统计记录
显示部分:
PHP代码
- <?php
- class configAction extends Action{
- function _initialize(){
- header("Content-Type:text/html; charset=utf-8");
- }
- public function tally()
- {
- $tally_=D(‘Tally’);
- $tallydata_=D(‘Tallydata’);
- $nowDate=date(‘Y-m-d’);
- $now[‘date’]=$nowDate;
- $now[‘iptotal’]=$this->gototal($nowDate,‘ip’);
- $now[‘pvtotal’]=$tallydata_->count(array(‘date’=>$nowDate),‘tdid’);
- $now[‘dltotal’]=$this->gototal($nowDate,‘cookie’);
- if($tally=$tally_->find(array(‘date’=>$nowDate))){
- $tally_->save(array(‘iptotal’=>$now[‘iptotal’],‘pvtotal’=>$now[‘pvtotal’],‘dltotal’=>$now[‘dltotal’]),array(‘date’=>$nowDate));
- }else{
- $tally_->create($now);
- $tally_->add();
- }
- $today[‘pv’]=$now[‘pvtotal’];
- $today[‘ip’]=$now[‘iptotal’];
- $today[‘dl’]=$now[‘dltotal’];
- $yesterdayDate=date(‘Y-m-d’,time()-3600*24);
- //echo $yesterdayDate;
- $yesterday=$tally_->find(array(‘date’=>$yesterdayDate));
- //dump($yesterday);
- $yesterday[‘pv’]=isset($yesterday[‘pvtotal’])?$yesterday[‘pvtotal’]:‘0’;
- $yesterday[‘ip’]=isset($yesterday[‘iptotal’])?$yesterday[‘iptotal’]:‘0’;
- $yesterday[‘dl’]=isset($yesterday[‘dltotal’])?$yesterday[‘dltotal’]:‘0’;
- $maxpv=$this->gomax(‘pvtotal’);
- $maxip=$this->gomax(‘iptotal’);
- $maxdl=$this->gomax(‘dltotal’);
- $max[‘pv’]=$maxpv[‘pvtotal’];
- $max[‘pvdate’]=$maxpv[‘date’];
- $max[‘ip’]=$maxip[‘iptotal’];
- $max[‘ipdate’]=$maxip[‘date’];
- $max[‘dl’]=$maxdl[‘dltotal’];
- $max[‘dldate’]=$maxdl[‘date’];
- $this->assign(‘today’,$today);
- $this->assign(‘yesterday’,$yesterday);
- $this->assign(‘max’,$max);
- $this->assign(‘nowtime’,date(‘Y年m月d日 H:i:s’));
- $this->display();
- }
- function gomax($a)
- {
- $tally_=D(‘Tally’);
- $max=$tally_->query("select * from `tally` order by `$a` desc limit 1");
- return $max[0];
- }
- function gototal($nowDate,$a)
- {
- $tallydata_=D(‘Tallydata’);
- $now[‘iptotal’]=$tallydata_->query("select count(distinct $a) from `tallydata` where `date`=’$nowDate’ ");
- return $now[‘iptotal’][0]["count(distinct $a)"];
- }
- }
- ?>