如何统计文章的日点击、周点击、月点击(求思路) 点击的话,一般都是用web server日志来记录的。之后再进行统计。周,月,季度 应该是在日的基础上累加。当然要是弄独立ip点击的话,按月,季度统计的话就计算量太大了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 存的时候有一个时间字段,存里面个时间截,然后按什么查,就看你怎么写SQL语句了。 很久以前写的一个统计的函数,希望你用的上其中$db为mysql的操作类。------------------------------------------------ /** * 访问量统计 * 每个ELSE后面$db->Execute("UPDATE `statistics_num` set `*Hits` = '0'");表示清零 * @param string $type 类型 */ function getStatisticsNum($field='*', $type=Null) { GLOBAL $db; $where = $type ? "`Type` = '{$type}'" : '1'; $result = $db->getRow("Select SUM(Hits) as Hits, SUM(DayHits) as DayHits From `statistics_num` "); Return $result; } function statisticsNum($type=Null) { GLOBAL $db; if(!$type)Return False; $result = $db->getRow("select * from `statistics_num` where `Type` = '{$type}';"); //print_r($result); if($result){ //从数据库里初始化 $id = $result['ID']; //该纪录ID $oldTimeStamp = $result['LastHits']; //最后点击时间 $hits = $result['Hits']; //总点击 $yhits = $result['YearHits']; //年点击 $mhits = $result['MonthHits']; //月点击 $whits = $result['WeekHits']; //周点击 $dhits = $result['DoubleDayHits']; //天点击 $ddhits = $result['DayHits']; //48小时点击 } else{ $oldTimeStamp = strtotime(date('Y-m-d 00:00:00', time())); $hits = $yhits = $mhits = $whits = $dhits = $ddhits = 0; } $nowDateArray = getdate(); $oldDateArray = getdate($oldTimeStamp); //year process if($nowDateArray["year"] == $oldDateArray["year"]): $yhits ++; else: @$db->Execute("UPDATE `statistics_num` set `YearHits` = '0' /*where `ID` = '{$id}'*/"); $yhits = 1; endif; //month process if($nowDateArray["year"] == $oldDateArray["year"] && $nowDateArray["mon"] == $oldDateArray["mon"]): $mhits ++; else: @$db->Execute("UPDATE `statistics_num` set `MonthHits` = '0'"); $mhits = 1; endif; //week process //取得本周的开始结束时间段-[13985019168] //本周开始时间,从今天开始后退n天到星期天的0点,一个周从星期天开始.如果从星期一开始把0,0,0改为23,59,59 $tmpStartDate = mktime(0,0,0,$nowDateArray["mon"],$nowDateArray["mday"],$nowDateArray["year"]) - ($nowDateArray["wday"] * 86400); //本周结束时间,本周六12点59 $tmpEndDate = mktime(23,59,59,$nowDateArray["mon"],$nowDateArray["mday"],$nowDateArray["year"]) + ((6 - $nowDateArray["wday"]) * 86400); //如果上次更新在这个时间段内,为同一周 if($oldTimeStamp >= $tmpStartDate && $oldTimeStamp <= $tmpEndDate): $whits ++; else: @$db->Execute("UPDATE `statistics_num` set `WeekHits` = '0'"); $whits = 1; endif; //double day process==>48hours //如果相差时间在48小时内,为同一个48小时 && //时间差大于48小时,清零 if( 60*60*24*2 < ($nowDateArray[0] - $oldDateArray[0]) ): @$db->Execute("UPDATE `statistics_num` set `DoubleDayHits` = '0'"); $ddhits = 1; //如果时间相差在24~48小时内,前一天+1 elseif( 60*60*24*2 > ($nowDateArray[0] - $oldDateArray[0]) && ($nowDateArray[0] - $oldDateArray[0]) > 60*60*24 ): $ddhits = $dhits+1; //如果相差在24小时内,直接+1 else: $ddhits = $ddhits+1; endif; //day process if( $nowDateArray["year"] == $oldDateArray["year"] && $nowDateArray["mon"] == $oldDateArray["mon"] && $nowDateArray["mday"] == $oldDateArray["mday"]): $dhits ++; else: @$db->Execute("UPDATE `statistics_num` set `DayHits` = '0', `LastHits` = '{$nowDateArray[0]}'"); $dhits = 1; endif; //接下来更新数据库 if($result){ $hits ++;//总点击数加1 $sql = "UPDATE `statistics_num` set `Hits` = '{$hits}', `LastHits` = '{$nowDateArray[0]}', `YearHits` = '{$yhits}', `MonthHits` = '{$mhits}', `WeekHits` = '{$whits}', `DayHits` = '{$dhits}', `DoubleDayHits` = '{$ddhits}' where `ID` = '{$id}'"; } else{ $sql = "INSERT INTO `statistics_num` (`Hits`, `YearHits`, `MonthHits`, `WeekHits`, `DoubleDayHits`, `DayHits`, `LastHits`, `Type`) VALUES ('1', '1', '1', '1', '1', '1', '" . time() . "', '{$type}');"; } $db->Execute($sql); }//End function 时间字段最好用time()函数获得的时间戳,不要搞个什么年月日时分秒的,效率低下。就存一个bigint类型的秒数最好。 其实建议你还是用第三方软件来做这个统计,或者直接LOADFILE apache的日志来分析比较好,随着数据量的增大,统计的效率也会是越来越慢。我有过这种经历,效率低的实在无法接受,后来把apache日志按天分页,这样apache每天的记录存为一个文件,然后用shell脚本定时的执行一个sql,sql来LOADFILE apache日志。之后执行复杂的统计计算,写入一张结果表里面,我的前台只需要读取那张表就可以了。所有的点击,排行有一天的时间缓存。这样既简单,效率又很高。 统计时以时间戳的形式INSERT到一个表,然后定时按时,日,月季,导到另一个表 一个正则表达式的问题 PHP网络编程:验证登录名和密码 求一个PHP函数,遍历目录包括子目录,如果文件夹下有html文件则删除。 在一个网站中,从一个PHP页面到ASP页面如何传参数 fsockopen 异步不了,急求大侠 请问:下面这个几行的小程序为何出错? 在ASP里.用XMLHTTP组件可以GET或POST一个远程连接. 怎样让发点发email 时都是发出同样的文本内容? discuz的数据库调用机制到底是怎么回事 初学php,请问文章(不是页面)对应的页面的哪个?预览文章时总是跳到首页 高过soap的兄弟帮忙看看 为什么别人不能访问我公司的网站。望达人现身!!
其中$db为mysql的操作类。
------------------------------------------------ /**
* 访问量统计
* 每个ELSE后面$db->Execute("UPDATE `statistics_num` set `*Hits` = '0'");表示清零
* @param string $type 类型
*/
function getStatisticsNum($field='*', $type=Null)
{
GLOBAL $db; $where = $type ? "`Type` = '{$type}'" : '1';
$result = $db->getRow("Select SUM(Hits) as Hits, SUM(DayHits) as DayHits From `statistics_num` ");
Return $result;
}
function statisticsNum($type=Null)
{
GLOBAL $db; if(!$type)Return False; $result = $db->getRow("select * from `statistics_num` where `Type` = '{$type}';");
//print_r($result); if($result){
//从数据库里初始化
$id = $result['ID']; //该纪录ID
$oldTimeStamp = $result['LastHits']; //最后点击时间
$hits = $result['Hits']; //总点击
$yhits = $result['YearHits']; //年点击
$mhits = $result['MonthHits']; //月点击
$whits = $result['WeekHits']; //周点击
$dhits = $result['DoubleDayHits']; //天点击
$ddhits = $result['DayHits']; //48小时点击
}
else{
$oldTimeStamp = strtotime(date('Y-m-d 00:00:00', time()));
$hits = $yhits = $mhits = $whits = $dhits = $ddhits = 0;
} $nowDateArray = getdate();
$oldDateArray = getdate($oldTimeStamp); //year process
if($nowDateArray["year"] == $oldDateArray["year"]):
$yhits ++;
else:
@$db->Execute("UPDATE `statistics_num` set `YearHits` = '0' /*where `ID` = '{$id}'*/");
$yhits = 1;
endif; //month process
if($nowDateArray["year"] == $oldDateArray["year"] && $nowDateArray["mon"] == $oldDateArray["mon"]):
$mhits ++;
else:
@$db->Execute("UPDATE `statistics_num` set `MonthHits` = '0'");
$mhits = 1;
endif; //week process
//取得本周的开始结束时间段-[13985019168] //本周开始时间,从今天开始后退n天到星期天的0点,一个周从星期天开始.如果从星期一开始把0,0,0改为23,59,59
$tmpStartDate = mktime(0,0,0,$nowDateArray["mon"],$nowDateArray["mday"],$nowDateArray["year"]) - ($nowDateArray["wday"] * 86400);
//本周结束时间,本周六12点59
$tmpEndDate = mktime(23,59,59,$nowDateArray["mon"],$nowDateArray["mday"],$nowDateArray["year"]) + ((6 - $nowDateArray["wday"]) * 86400);
//如果上次更新在这个时间段内,为同一周
if($oldTimeStamp >= $tmpStartDate && $oldTimeStamp <= $tmpEndDate):
$whits ++;
else:
@$db->Execute("UPDATE `statistics_num` set `WeekHits` = '0'");
$whits = 1;
endif;
//double day process==>48hours
//如果相差时间在48小时内,为同一个48小时 &&
//时间差大于48小时,清零
if( 60*60*24*2 < ($nowDateArray[0] - $oldDateArray[0]) ):
@$db->Execute("UPDATE `statistics_num` set `DoubleDayHits` = '0'");
$ddhits = 1;
//如果时间相差在24~48小时内,前一天+1
elseif( 60*60*24*2 > ($nowDateArray[0] - $oldDateArray[0]) && ($nowDateArray[0] - $oldDateArray[0]) > 60*60*24 ):
$ddhits = $dhits+1;
//如果相差在24小时内,直接+1
else:
$ddhits = $ddhits+1;
endif;
//day process
if( $nowDateArray["year"] == $oldDateArray["year"] &&
$nowDateArray["mon"] == $oldDateArray["mon"] &&
$nowDateArray["mday"] == $oldDateArray["mday"]):
$dhits ++;
else:
@$db->Execute("UPDATE `statistics_num` set `DayHits` = '0', `LastHits` = '{$nowDateArray[0]}'");
$dhits = 1;
endif;
//接下来更新数据库
if($result){
$hits ++;//总点击数加1 $sql = "UPDATE `statistics_num` set `Hits` = '{$hits}', `LastHits` = '{$nowDateArray[0]}', `YearHits` = '{$yhits}', `MonthHits` = '{$mhits}', `WeekHits` = '{$whits}', `DayHits` = '{$dhits}', `DoubleDayHits` = '{$ddhits}' where `ID` = '{$id}'";
}
else{
$sql = "INSERT INTO `statistics_num` (`Hits`, `YearHits`, `MonthHits`, `WeekHits`, `DoubleDayHits`, `DayHits`, `LastHits`, `Type`) VALUES ('1', '1', '1', '1', '1', '1', '" . time() . "', '{$type}');";
} $db->Execute($sql);
}//End function