Mar
24
昨天在一个站上看到有人说怎样才能很好的统计一个网站的浏览次数,其实这一个问题是很多基础教程都会出现的一个例子
一般都是直接用一个文件来当数据文件来写,其实这样也是没有问题的。正常情况下可以用来统计浏览数,但是如果对一个访问量大的站来说,可能是不对的.因为同一时间内,可能有几十个几百个人在浏览网站,那如果都对同一个文件进行读写,有可能会出现写入错误(ext2/3文件系统通过flock进行文件锁来控制写入错误);或者有十个人同时浏览网站,而由于只有一个人能写入文件,其它九个人都被忽略了,那样就会小了九个浏览数。
而我这个函数就是用来解决上面的两个问题,采用了文件读写锁,然后每次随机写某个分散文件内,分某个分散文件达到一定位数的时候就把它写入到总浏览,大大减小了同时对同一文件进行读写。
/**
* 功能描述:对一个网站所以页面被浏览次数的统计
* @Date:2007-3-24
* @Copyright © bkkkd
* @Site:http://atim.cn
**/
Function recordviewnum()
{
$randnum=10;//最多的分散文件数
$Updatesite=2;//当分散文件保存的浏览数达到几位时写入到总浏览数
$rand=rand(1,$randnum);
$D_path="./viewtotal/$rand.php";
$T_path="./viewtotal/set.php";
touch($D_path);
touch($T_path);
$D_size=filesize($D_path);
$T_size=filesize($T_path);
If($D_size>=$Updatesite)
{
$D_fp=fopen($D_path,"rb+");
if($D_fp)
{
flock($D_fp,LOCK_EX);
$D_viewnum=intval(fread($D_fp,$D_size));
$D_viewnum+=1;
fseek($D_fp,0);
fwrite($D_fp,0);
ftruncate($D_fp,1);
fclose($D_fp);
$T_fp=fopen($T_path,"rb+");
if($T_fp)
{
flock($T_fp,LOCK_EX);
$T_viewnum=intval(fread($T_fp,$T_size));
$T_viewnum=$T_viewnum+$D_viewnum;
fseek($T_fp,0);
fwrite($T_fp,$T_viewnum);
fclose($T_fp);
}
}
}
Else
{
$D_fp=fopen($D_path,"rb+");
if($D_fp)
{
flock($D_fp,LOCK_EX);
$D_viewnum=intval(fread($D_fp,$D_size));
$D_viewnum+=1;
fseek($D_fp,0);
fwrite($D_fp,$D_viewnum);
ftruncate($D_fp,strlen($D_viewnum));
fclose($D_fp);
$T_fp=fopen($T_path,"rb");
if($T_fp)
{
flock($T_fp,LOCK_SH);
$T_viewnum=intval(fread($T_fp,$T_size));
fclose($T_fp);
}
}
}
Return $T_viewnum;
}
一般都是直接用一个文件来当数据文件来写,其实这样也是没有问题的。正常情况下可以用来统计浏览数,但是如果对一个访问量大的站来说,可能是不对的.因为同一时间内,可能有几十个几百个人在浏览网站,那如果都对同一个文件进行读写,有可能会出现写入错误(ext2/3文件系统通过flock进行文件锁来控制写入错误);或者有十个人同时浏览网站,而由于只有一个人能写入文件,其它九个人都被忽略了,那样就会小了九个浏览数。
而我这个函数就是用来解决上面的两个问题,采用了文件读写锁,然后每次随机写某个分散文件内,分某个分散文件达到一定位数的时候就把它写入到总浏览,大大减小了同时对同一文件进行读写。
/**
* 功能描述:对一个网站所以页面被浏览次数的统计
* @Date:2007-3-24
* @Copyright © bkkkd
* @Site:http://atim.cn
**/
Function recordviewnum()
{
$randnum=10;//最多的分散文件数
$Updatesite=2;//当分散文件保存的浏览数达到几位时写入到总浏览数
$rand=rand(1,$randnum);
$D_path="./viewtotal/$rand.php";
$T_path="./viewtotal/set.php";
touch($D_path);
touch($T_path);
$D_size=filesize($D_path);
$T_size=filesize($T_path);
If($D_size>=$Updatesite)
{
$D_fp=fopen($D_path,"rb+");
if($D_fp)
{
flock($D_fp,LOCK_EX);
$D_viewnum=intval(fread($D_fp,$D_size));
$D_viewnum+=1;
fseek($D_fp,0);
fwrite($D_fp,0);
ftruncate($D_fp,1);
fclose($D_fp);
$T_fp=fopen($T_path,"rb+");
if($T_fp)
{
flock($T_fp,LOCK_EX);
$T_viewnum=intval(fread($T_fp,$T_size));
$T_viewnum=$T_viewnum+$D_viewnum;
fseek($T_fp,0);
fwrite($T_fp,$T_viewnum);
fclose($T_fp);
}
}
}
Else
{
$D_fp=fopen($D_path,"rb+");
if($D_fp)
{
flock($D_fp,LOCK_EX);
$D_viewnum=intval(fread($D_fp,$D_size));
$D_viewnum+=1;
fseek($D_fp,0);
fwrite($D_fp,$D_viewnum);
ftruncate($D_fp,strlen($D_viewnum));
fclose($D_fp);
$T_fp=fopen($T_path,"rb");
if($T_fp)
{
flock($T_fp,LOCK_SH);
$T_viewnum=intval(fread($T_fp,$T_size));
fclose($T_fp);
}
}
}
Return $T_viewnum;
}
没听过