文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>利用apache的日志文件进行网站流量统计

利用apache的日志文件进行网站流量统计

时间:2007-02-17  来源:PHP爱好者

一、环境:freebsd(linux)+apache+php+mysql
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
二、概述:对于使用apache作为web服务器的网站来说,apache的access_log是进行流量统计的重要的依据。
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
根据access_log文件来进行流量统计的方法有两种,一种是直接在程序中对log文件进行分析,这种
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
方法的一个明显的缺点是速度比较慢,比较耗费资源,因为一个浏览量较高的网站的log文件是非常
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
大的,一个典型的例子是老外用c写的analog;另一种方法是把每日的log文件记录导入数据库,再
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
用程序对数据库进行分析,这种方法相对前者来说有比较大的速度和性能上的优势。这里我写的这个
程序的功能虽然不及analog等强大,但是……,自己的东西用的还是比较舒服的,呵呵,不过这只是
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
我的方法,中间可能会有一些不对的地方,请大家指正。
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
三、具体实现:主要利用freebsd(linux)的crontab每天自动定时执行程序产生每日的html格式的流量报表文件。
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
注意:以下命令以apache默认的log文件格式处理,如果你定制了不同的log文件格式,具体命令要根据具体情况修改。
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
并且要以cgi方式编译一次php,以便以命令行方式运行php程序。
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
1.your_log数据表结构
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
根据apache默认的log文件中的子段,可以很容易地设计your_log数据表的结构:
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
CREATE TABLE your_log (
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
host varchar(15) NOT NULL,
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
ident varchar(8) NOT NULL,
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
auth varchar(20) NOT NULL,
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
time varchar(24) NOT NULL,
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
zone varchar(8) NOT NULL,
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
method varchar(6) NOT NULL,
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
file varchar(255) NOT NULL,
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
protocol varchar(10) NOT NULL,
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
status varchar(5) NOT NULL,
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
bytes int(10) DEFAULT '0' NOT NULL,
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
KEY host (host),
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
KEY file (file),
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
KEY status (status),
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
KEY bytes (bytes)
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
);
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
2.分离log文件,形成每天一个log文件,以日期为目录,文件名自定(假设是your_log)
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
考虑这个步骤时,想到过利用linux的logrotate功能和apache自带的rotatelogs功能,但是由于我用的是freebsd,没有找到
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
logrotate命令,而apache的rotatelogs我用之后没有发现能够指定生成文件名的功能,只能用timestamp作为文件名,对于
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
程序来说不好处理,所以我自己想了以下的方法,如果有人认为这样不好而能提供更好的方法,请不吝赐教:)
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
mkdir /your_log_dir/`date -v-1d "+%Y%m%d"` #建立每天的log文件目录
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
cat /your_apache_log_dir/access_log | grep `date -v-1d "+%d/%b/%Y"` > your_log_dir/`date -v-1d "+%Y%m%d"`/your_log
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
将此二命令放入crontab,我设为每天凌晨1点自动运行(时间可自己定,但是一定要在0点以后)。
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
3.将日报文件导入数据库
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
/your_mysql_bin_dir/mysqlimport -u mysql_username -p mysql_password -d --fields-terminated-by=' ' your_db_name your_log_dir/`date -v-1d "+%Y%m%d"`/your_log
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
这个命令先将your_db_name数据库中的your_log数据表清空,再从已生成的your_log文本文件里导入数据,以空格为字段分界。
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
将此命令放入crontab,我设为每天凌晨1:30自动运行(时间可自己定,但是一定要在执行第2步以后,先后顺序不能颠倒)。
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
4.生成每日流量统计日报html文件的php程序
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
a.假设网站的document_root下有以下四个子目录(栏目):aaa,bbb,ccc,ddd,如有更多,依此类推;
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
b.这里只在日报页面上计算以下几个统计数字:数据总流量、总请求次数、访问主机数、总pageview数量、
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
各个栏目之pageview数量、每小时的pageview数量;
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
c.根据RFC2616标准,请求状态编码中以4和5开头的均为错误或无效请求,在统计时应过滤掉这些数字;
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
d.这里我假设整个网站以php构建,计算流量时只考虑*.php和*.html文件以及纯目录请求的次数。
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
e.可以根据个人的需要增加很多统计数字,如工作时间与非工作时间的流量等等,这里就不赘述了,请大家自己考虑吧:)
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
[dreport.php代码文件]
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
<?php
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
//--连接数据库--
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$db=@mysql_connect("localhost","user","password") or die(mysql_error());
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
@mysql_select_db("your_db_name",$db) or die(mysql_error());
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
//--取前一天的timestamp--
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$yestoday_array=getdate(time()-24*60*60);
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$start_time=mktime(0,0,0,$yestoday_array["mon"],$yestoday_array["mday"],$yestoday_array["year"]);
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$end_time=mktime(23,59,59,$yestoday_array["mon"],$yestoday_array["mday"],$yestoday_array["year"]);
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

//--计算总数据流量--
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$bytes=0;
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sql0="select bytes from your_log";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$res0=mysql_query($sql0) or die(mysql_error());
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
while($row0=@mysql_fetch_row($res0)){
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$bytes+=$row0[0];
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
}
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
//--计算总请求次数--
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sql1="select count(host) from your_log";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$res1=mysql_query($sql1) or die(mysql_error());
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$row1=@mysql_fetch_row($res1);
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$hits=$row1[0];
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
//--计算访问主机数量--
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sql2="select distinct host from your_log";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$res2=mysql_query($sql2) or die(mysql_error());
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$ips=@mysql_num_rows($res2);
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
//--计算总pageviews--
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sql4="select count(host) from your_log where (file like '%.html%' ";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sql4.="or file like '%.php%' or file not like '%.%') ";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sql4.="and left(status,1) <> '4' and left(status,1) <> '5'";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$res4=mysql_query($sql4) or die(mysql_error());
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$row4=@mysql_fetch_row($res4);
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$pageviews=$row4[0];
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
//--计算aaa栏目的pageviews--
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sql5="select count(host) from your_log where file like '%/aaa/%' ";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sql5.="and (file like '%.php%' or file like '%.html%' or file not like '%.%') ";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sql5.="and left(status,1) <> '4' and left(status,1) <> '5'";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$res5=mysql_query($sql5) or die(mysql_error());
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$row5=@mysql_fetch_row($res5);
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$aaapvs=$row5[0];
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
//--计算bbb栏目的pageviews--
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sql6="select count(host) from your_log where file like '%/bbb/%' ";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sql6.="and (file like '%.php%' or file like '%.html%' or file not like '%.%') ";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sql6.="and left(status,1) <> '4' and left(status,1) <> '5'";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$res6=mysql_query($sql6) or die(mysql_error());
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$row6=@mysql_fetch_row($res6);
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$bbbpvs=$row6[0];
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
//--计算ccc栏目的pageviews--
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sql7="select count(host) from your_log where file like '%/ccc/%' ";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sql7.="and (file like '%.php%' or file like '%.html%' or file not like '%.%') ";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sql7.="and left(status,1) <> '4' and left(status,1) <> '5'";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$res7=mysql_query($sql7) or die(mysql_error());
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$row7=@mysql_fetch_row($res7);
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$cccpvs=$row7[0];
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
//--计算ddd栏目的pageviews--
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sql8="select count(host) from your_log where file like '%/ddd/%' ";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sql8.="and (file like '%.php%' or file like '%.html%' or file not like '%.%') ";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sql8.="and left(status,1) <> '4' and left(status,1) <> '5'";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$res8=mysql_query($sql8) or die(mysql_error());
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$row8=@mysql_fetch_row($res8);
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$dddpvs=$row8[0];
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
//--计算首页的pageviews--
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sqlg="select count(host) from your_log where (file = '/' or file = '/index.html') ";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sqlg.="and left(status,1) <> '4' and left(status,1) <> '5'";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$resg=mysql_query($sqlg) or die(mysql_error());
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$rowg=@mysql_fetch_row($resg);
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$indexpvs=$rowg[0];
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
//--report是生成日报文件的字符串--
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report="<HTML>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.="<HEAD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.="<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.="<TITLE>流量统计日报</TITLE>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.="</HEAD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.="<BODY>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.="时间:".date("Y-m-d H:i:s",$start_time)." -- ".date("Y-m-d H:i:s",$end_time)."<BR><BR>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.="<FONT SIZE="+2"><B><I>PageViews:</I></B></FONT>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.="<P>数据吞吐总量:".$bytes."&nbsp;Bytes<BR>请求次数:".$hits."  IP主机数:<FONT COLOR="green">".$ips."</FONT><BR>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" PageViews:<FONT COLOR="red">".$pageviews."</FONT></P>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.="<P><FONT FACE="宋体" COLOR="#008000" SIZE="3"><B>各个栏目PageViews:</B></FONT></P>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.="<TABLE WIDTH="300" BORDER="1">n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TBODY>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TR>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD>/</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD>首页</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD>".$indexpvs."</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" </TR>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TR>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD>/aaa/</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD>aaa栏目</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD>".$aaapvs."</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" </TR>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TR>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD>/bbb/</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD>bbb栏目</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD>".$bbbpvs."</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" </TR>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TR>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD>/ccc/</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD>ccc栏目</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD>".$cccpvs."</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" </TR>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TR>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD>/ddd/</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD>ddd栏目</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD>".$dddpvs."</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" </TR>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TR>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD> </TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD>总数</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD>".$pageviews."</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" </TR>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" </TBODY>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.="</TABLE>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.="<P><FONT FACE="宋体" COLOR="#008000" SIZE="3"><B>每小时PageViews:</B></FONT></P>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.="<TABLE WIDTH="300" BORDER="1">n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <COL WIDTH="439" STYLE="mso-width-source:userset;mso-width-alt:14048;width:329pt">n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <COL WIDTH="120" STYLE="mso-width-source:userset;mso-width-alt:3840;width:90pt">n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TR HEIGHT="21" STYLE="n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD HEIGHT="21" CLASS="xl22" WIDTH="200" STYLE="Hour</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD CLASS="xl22" WIDTH="100" HEIGHT="21"><SPAN STYLE="mso-spacerun:yes">&nbsp;</SPAN> Page Views</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" </TR>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
//--每小时的pageview--
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
for($i=0;$i<24;$i++){
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$date_temp=date("[d/M/Y:",time()-24*60*60).sprintf("%02d",$i);
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sqlh="select count(host) from your_log where (file like '%.html%' or file like '%.php%' ";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sqlh.="or file not like '%.%') and time like '$date_temp%' ";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$sqlh.="and left(status,1) <> '4' and left(status,1) <> '5'";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$resh=mysql_query($sqlh) or die(mysql_error());
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$rowh=@mysql_fetch_row($resh);
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TR HEIGHT="19" STYLE="n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD HEIGHT="19" CLASS="xl23" STYLE="".sprintf("%02d",$i).":00 - ".sprintf("%02d",$i).":59</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" <TD CLASS="xl23" x:num WIDTH="100" HEIGHT="19">".$rowh[0]."</TD>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.=" </TR>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
}
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
//--关闭数据库--
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
mysql_close();
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.="</TABLE>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.="</BODY>n";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report.="</HTML>";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
//--生成每天的流量统计html页面文件,以日期为文件名--
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$report_file="/your_report_dir/".date("Ymd",time()-24*60*60).".html";
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
$fp=fopen($report_file,"w");
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
fwrite($fp,$report);
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
fclose($fp);
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
?>
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
5.每天凌晨执行2、3步后执行此程序,将自动产生前一天的流量统计html页面
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
/your_php_bin_dir/php /some_dir/dreport.php
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
将此命令放入crontab,我设为每天凌晨2:00自动运行(时间可自己定,但是一定要在第3步以后,先后顺序不能颠倒)。
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX

chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
四、结束语
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
终于要写完了,这里还要补充一些东西。对于流量非常大的大型网站,可能并不适合把以上的步骤都放在web服务器上
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
自动定时运行,因为可能会对服务器造成比较大的负荷,所以当遇到这种情况时,也许用php来完成这个任务并不是很好的
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
选择,可以考虑用效率最高的c/c++来写程序,还有就是可以考虑把apache的日志文件下载到本地的服务器,再用以上方法
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
来完成任务。还要提醒朋友们,这里主要阐述的是一个解决方案、一种思路,遇到不同的情况时还是要具体问题具体分析
chi na it p owe r .comXibNbPsMkXxI7d4utj22rwKjX
的:),我把它写出来希望能够起到抛砖引玉的作用,期待您的意见与建议!(是不是有人嫌我太罗嗦了?我走……)
php爱好者站 http://www.phpfans.net 为phper提供一切资讯.
相关阅读 更多 +
排行榜 更多 +
<img preview="http://pic.pdowncc.com/uploadimg/ico/2025/0523/1747993424374100.png" width="32" height="32" src="http://pic.pdowncc.com/uploadimg/ico/2025/0523/1747993424374100.png" alt="弓箭勇者最新版" />

<img preview="http://pic.pdowncc.com/uploadimg/ico/2025/0523/1747993424374100.png" width="32" height="32" src="http://pic.pdowncc.com/uploadimg/ico/2025/0523/1747993424374100.png" alt="弓箭勇者最新版" />

飞行射击 下载
<img preview="http://pic.pdowncc.com/uploadimg/ico/2025/0523/1747993424374100.png" width="32" height="32" src="http://pic.pdowncc.com/uploadimg/ico/2025/0523/1747993424374100.png" alt="弓箭勇者最新版" />

<img preview="http://pic.pdowncc.com/uploadimg/ico/2025/0523/1747993424374100.png" width="32" height="32" src="http://pic.pdowncc.com/uploadimg/ico/2025/0523/1747993424374100.png" alt="弓箭勇者最新版" />

飞行射击 下载
<img preview="http://pic.pdowncc.com/uploadimg/ico/2025/0523/1747993424374100.png" width="32" height="32" src="http://pic.pdowncc.com/uploadimg/ico/2025/0523/1747993424374100.png" alt="弓箭勇者最新版" />

<img preview="http://pic.pdowncc.com/uploadimg/ico/2025/0523/1747993424374100.png" width="32" height="32" src="http://pic.pdowncc.com/uploadimg/ico/2025/0523/1747993424374100.png" alt="弓箭勇者最新版" />

飞行射击 下载