作者magicfx (去南半球度假)
看板PHP
标题[请益] 计数器在流量大的时候会归零
时间Sat Mar 26 13:17:00 2011
遇到流量大的时候
多人同时点击按钮
刚好同时写入count.php时
就会让档案清空
造成计数器归零
已经尝试加入 lock 的机制
但还是没效!
index.php里有个按钮
按下去会让count.php里的值+1
然後一开始会检查使用者是不是在一小时内浏览过
如果不是 计数器就加一
麻烦帮看一下code哪里需要修改
谢谢
===
index.php
===
<?php
$counter = intval(file_get_contents("count.php"));
if(!isset($_COOKIE['visitor'])){
$counter++;
//一个小时後若再浏览 则计数器+1
$fp = fopen("count.php", "w");
if (flock($fp, LOCK_EX)){ // do an exclusive lock
//ftruncate($fp, 0);
fwrite($fp, $counter);
flock($fp, LOCK_UN); // release the lock
}
fclose($fp);
setcookie("visitor", 1, time()+3600);
}
?>
===
===
add.php
===
<?php
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Content-type: application/json');
$filename = "count.php";
//把计数的值写在 count.php 里
//$contents = '';
$handle = fopen($filename, "r");
if (flock($handle, LOCK_SH)) {// do a read lock
(int)$contents = fread($handle, filesize($filename));
flock($handle, LOCK_UN); // release the lock
}
fclose($handle);
$fh = fopen($filename, "w+");
if(flock($fh, LOCK_EX)){ // do an exclusive lock
//ftruncate($fh, 0);
$contents++;
fputs($fh, $contents);
flock($fh, LOCK_UN); // release the lock
}
fclose($fh);
$data = array("result" => $contents);
echo json_encode($data);
exit;
?>
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.142.198.86
1F:→ cyranoh:w+时档案已经被清空 同时如果有get_contents发生 就会归零 03/27 00:16
2F:→ buganini:有个破方法 每次append一个byte 取filesize 03/27 01:26
3F:→ buganini:可以就写chr(0)进去 unix上定期去把他弄sparse file 03/27 01:27
4F:→ buganini:就不会占啥空间 03/27 01:27
5F:→ buganini:不过其实你用SQL写update xxx set value=value+1就好了 03/27 01:28
6F:推 davidou:有一个方式不知道可不可行 要是W+抓到是空的值的话 就不要 03/30 21:59
7F:→ davidou:写入sleep一下 再重新w+一次 用个while试试看 03/30 21:59
8F:→ magicfx:thx 04/03 19:47