<?php
$path=dirname(__FILE__)."/eceye_cache/count_visit.txt";
$array=file($path);
if (!is_array($array)) {
die("统计文件出错!");
}//load
$today=intval($array[0]);
$today_date=date("j");
$yesterdayArray=explode("|",$array[1]);
$yesterday=intval($yesterdayArray[0]);
$record_date=intval($yesterdayArray[1]);
$total=intval($array[2]);
//write data
if (!$_COOKIE['is_visited']) {
//今日量加一
$today=$today+1;
//访问总量加一
$total=$total+1;
//如果第二行记录的日期与今日不等
if ($today_date != $record_date) {
//将今日访问量写入昨天,同时将今日访问清零
$yesterday_str=$today . "|" . $today_date;
$today=1 ;
}else{
//如果第二行记录距离现在没有24小时
//保持昨日统计信息不变,今日统计加一
$today=$today;
$yesterday_str=$yesterday . "|" . $record_date;
}
$temp=$today."\n".$yesterday_str."\n".$total;
file_put_contents($path,$temp,LOCK_EX);
echo("<script src='http://{$_SERVER['HTTP_HOST']}/count_visit_setcookie.php'></script>");
}
//out put
echo "今日:{$array[0]}人次<br>昨日:{$yesterdayArray[0]}人次<br>总计:{$array[2]}人次";
?>count_visit.txt内容:
3
4|16
3261
错误现象,在测试时发现,当并发达到一定数量时,会出现数据丢失现象(即count_visit.txt第二行,第三行都被清空),然后重新计数。在实际运行中发现同样的问题,当访问量稍微高一点总访问量、昨日访问量等都被丢失重新计算。
$path=dirname(__FILE__)."/eceye_cache/count_visit.txt";
$array=file($path);
if (!is_array($array)) {
die("统计文件出错!");
}//load
$today=intval($array[0]);
$today_date=date("j");
$yesterdayArray=explode("|",$array[1]);
$yesterday=intval($yesterdayArray[0]);
$record_date=intval($yesterdayArray[1]);
$total=intval($array[2]);
//write data
if (!$_COOKIE['is_visited']) {
//今日量加一
$today=$today+1;
//访问总量加一
$total=$total+1;
//如果第二行记录的日期与今日不等
if ($today_date != $record_date) {
//将今日访问量写入昨天,同时将今日访问清零
$yesterday_str=$today . "|" . $today_date;
$today=1 ;
}else{
//如果第二行记录距离现在没有24小时
//保持昨日统计信息不变,今日统计加一
$today=$today;
$yesterday_str=$yesterday . "|" . $record_date;
}
$temp=$today."\n".$yesterday_str."\n".$total;
file_put_contents($path,$temp,LOCK_EX);
echo("<script src='http://{$_SERVER['HTTP_HOST']}/count_visit_setcookie.php'></script>");
}
//out put
echo "今日:{$array[0]}人次<br>昨日:{$yesterdayArray[0]}人次<br>总计:{$array[2]}人次";
?>count_visit.txt内容:
3
4|16
3261
错误现象,在测试时发现,当并发达到一定数量时,会出现数据丢失现象(即count_visit.txt第二行,第三行都被清空),然后重新计数。在实际运行中发现同样的问题,当访问量稍微高一点总访问量、昨日访问量等都被丢失重新计算。
解决方案 »
- 想实现POST自动提交表单的功能,我用PHP做了一下,但不对,大家帮帮我看看
- 怎样查看一个项目中哪些代码被运行
- header把字符串输出为一文件,弹出无法下载的对话框
- smarty模板中使用{php}
- 输入日期时如何实现点击按钮出现日历,点日期自已填入输入控件中?
- 模板之我见
- 请教adodb类怎样的到刚加入mysql库中记录的id号,在线急等回复。谢谢 没分了,请原谅
- 如何实现图片与文字的混合上传?
- 大家来讨论现在的网页制作技术怎样创新?
- 什么情况下用到redis数据库?什么样的数据库适合放在redis里尼?
- php中,用echo调用JS函数,有什么问题?
- php源文件编码与操作系统文件编码冲突导致中文乱码
可以使用flock 来处理这个事情。另外写数据库是件比较好的办法。
不过...用数据库SQL做吧
多进程PHP没有完美解决方案
即使做到都没有数据库做得好另外提供你一个方法,可能有改善
将file_put_contents放到程式最后
即运行完file_put_contents立即终结
使用Flock函数对文件进行写入锁定,然后慢慢写入,不用当心数据丢失。用数据库最好,但是数据库在大的并发性是也会出现数据丢失,数据乱套的现象,用事务可以解决。
if(@$fp = fopen($path, 'w')) {
flock($fp, 2);
fwrite($fp, $temp);
fclose($fp);
} else {
exit('写入文件错误!');
}
现在才看到大家这么多热心回复
其实我早就尝试过使用flock函数
代码和这位兄弟的差不多:
if(@$fp = fopen($path, 'w')) {
flock($fp, 2);
fwrite($fp, $temp);
fclose($fp);
} else {
exit('写入文件错误!');
}我的代码只是在写入完成后多了一个unlock
这种锁定的方式仍然会出问题,只是稍微好一点点而已
是不是PHP的内部运行机制就天生存在此问题呢
所有的程序(ASP、JSP)都会出现的错误,你说连数据库那么好的引擎也会出现写入错误的现象,文件操作会不出现这样的错误吗????看来,楼主可以用sleep函数停一下再执行。代码:
<?php
$path=dirname(__FILE__)."/eceye_cache/count_visit.txt";
$array=file($path);
if (!is_array($array)) {
die("统计文件出错!");
}//load
$today=intval($array[0]);
$today_date=date("j");
$yesterdayArray=explode("|",$array[1]);
$yesterday=intval($yesterdayArray[0]);
$record_date=intval($yesterdayArray[1]);
$total=intval($array[2]);
//write data
if (!$_COOKIE['is_visited']) {
//今日量加一
$today=$today+1;
//访问总量加一
$total=$total+1;
//如果第二行记录的日期与今日不等
if ($today_date != $record_date) {
//将今日访问量写入昨天,同时将今日访问清零
$yesterday_str=$today . "|" . $today_date;
$today=1 ;
}else{
//如果第二行记录距离现在没有24小时
//保持昨日统计信息不变,今日统计加一
$today=$today;
$yesterday_str=$yesterday . "|" . $record_date;
}
$temp=$today."\n".$yesterday_str."\n".$total;
sleep(1);//停1秒
file_put_contents($path,$temp,LOCK_EX);
echo("<script src='http://{$_SERVER['HTTP_HOST']}/count_visit_setcookie.php'></script>");
}
//out put
echo "今日:{$array[0]}人次<br>昨日:{$yesterdayArray[0]}人次<br>总计:{$array[2]}人次";
不过楼上的写入量有点恐怖,这样大的数据我没接触过,所以不发表看法。
$path=dirname(__FILE__)."/eceye_cache/count_visit.txt";
$handle=fopen($path,"r");
if ($handle) {
if(!flock($handle,LOCK_EX)){
echo "<script>alert('读取锁定失败,请将此问题报告给我们,谢谢!')</script>";
}
$array=file($path);
flock($handle,LOCK_UN);
fclose($handle);
}if (!is_array($array)) {
die("统计文件出错!");
}//load
$today=intval($array[0]);
$today_date=date("j");
$yesterdayArray=explode("|",$array[1]);
$yesterday=intval($yesterdayArray[0]);
$record_date=intval($yesterdayArray[1]);
$total=intval($array[2]);
//write data
if (!$_COOKIE['is_visited']) {
//今日量加一
$today=$today+1;
//访问总量加一
$total=$total+1;
//如果第二行记录的日期与今日不等
if ($today_date != $record_date) {
//将今日访问量写入昨天,同时将今日访问清零
$yesterday_str=$today . "|" . $today_date;
$today=1 ;
}else{
//如果第二行记录距离现在没有24小时
//保持昨日统计信息不变,今日统计加一
$today=$today;
$yesterday_str=$yesterday . "|" . $record_date;
}
$temp=$today."\n".$yesterday_str."\n".$total;
file_put_contents($path,$temp,LOCK_EX);
echo("<script src='http://{$_SERVER['HTTP_HOST']}/count_visit_setcookie.php'></script>");
}
//out put
echo "今日:{$array[0]}人次<br>昨日:{$yesterdayArray[0]}人次<br>总计:{$array[2]}人次";