作者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