[請益] 計數器在流量大的時候會歸零

看板PHP作者 (去南半球度假)時間13年前 (2011/03/26 13:17), 編輯推噓1(107)
留言8則, 4人參與, 最新討論串1/1
遇到流量大的時候 多人同時點擊按鈕 剛好同時寫入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

03/27 00:16, , 1F
w+時檔案已經被清空 同時如果有get_contents發生 就會歸零
03/27 00:16, 1F

03/27 01:26, , 2F
有個破方法 每次append一個byte 取filesize
03/27 01:26, 2F

03/27 01:27, , 3F
可以就寫chr(0)進去 unix上定期去把他弄sparse file
03/27 01:27, 3F

03/27 01:27, , 4F
就不會佔啥空間
03/27 01:27, 4F

03/27 01:28, , 5F
不過其實你用SQL寫update xxx set value=value+1就好了
03/27 01:28, 5F

03/30 21:59, , 6F
有一個方式不知道可不可行 要是W+抓到是空的值的話 就不要
03/30 21:59, 6F

03/30 21:59, , 7F
寫入sleep一下 再重新w+一次 用個while試試看
03/30 21:59, 7F

04/03 19:47, , 8F
thx
04/03 19:47, 8F
文章代碼(AID): #1DZNRGPR (PHP)