php 统计uv,简单网站统计功能的实现 PV IP 真实访客数(UV) | 学步园

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

0_13311970091vkc.gif

需要用到二张表

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框架,所以贴出的只是代码片段!因为代码刚完成,所以没有做优化以及注释)

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`

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天以前的全部统计记录

显示部分:

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)"];

}

}

?>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值