2012-07-12 30 views
0

我使用以下基本PHP:命中計數器復位/降到非常低的隨機

<?php 

    if (file_exists('count_file.txt')) 
    { 
     $fil = fopen('count_file.txt', r); 
     $dat = fread($fil, filesize('count_file.txt')); 
     echo $dat+1; 
     fclose($fil); 
     $fil = fopen('count_file.txt', w); 
     fwrite($fil, $dat+1); 
    } 

    else 
    { 
     $fil = fopen('count_file.txt', w); 
     fwrite($fil, 1); 
     echo '1'; 
     fclose($fil); 
    } 
?> 

的命中計數器(我寧願沒有之一,但我們這樣做是一直堅持)。 txt文件保持點擊的計數,它的工作原理...但隨機(有時後幾個星期,有時幾個月後)決定絆倒,並從4300下降到11。誰能告訴我如何糾正這一點因爲它變得煩人?

+0

您的計數器缺少文件鎖定。看見'flock'。否則,如果多個腳本一次打開並保存文件,則可以輕鬆地獲得競爭條件。 [http://en.wikipedia.org/wiki/Atomicity_(database_systems)](http://en.wikipedia.org/wiki/Atomicity_(database_systems)) – hakre 2012-07-12 12:21:33

+0

請您詳細說明一下嗎?我對PHP很陌生,這讓我花了很多時間纔得到工作 – John 2012-07-12 12:23:12

+0

PHP手冊解釋了'flock'函數。在該頁面上,您將找到用戶註釋,進一步解釋並展示他們如何在文件中寫入這樣一個計數器的立場。 – hakre 2012-07-12 12:24:35

回答

1

您沒有使用任何鎖定。如果兩個或多個請求同時觸發您的服務器,他們將會跺腳對方的文件操作。這種事情最好在數據庫中完成。

+1

文件系統是一個數據庫。 – hakre 2012-07-12 12:22:33

1

文件大小函數告訴你文件中的字節數。 PHP.net可以描述該功能對你的作用。不要使用這個函數,你應該從文件中讀取一行(fgets)(該行應該有命中計數),然後你在命中計數中加1,然後重新保存。

讓我給你一個比喻。你在廚房裏,你拉出一個藍莓容器,你想知道有多少藍莓,但你問容器有多少英寸長。然後,你擺脫所有的藍莓,並把英寸數+ 1藍莓的容器。沒有任何意義,但這是你的腳本所做的。如果你改變這樣一行:$ dat = fread($ fil,filesize('count_file.txt')); TO $ dat = fgets($ fil);你應該閱讀你有多少藍莓,加上一個數字並重新保存。

+0

對不起,這是我的頭... – John 2012-07-12 12:36:11

+0

好吧,忽略他們告訴你有關文件鎖定。根據您的經驗水平,我懷疑您是否正在與一個甚至是重要的網站合作。有關更多詳細信息,請參閱修改答案。 – 2012-07-12 22:29:43