2011-12-19 23 views
1

我使用下面的代碼:基本的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); 
} 

這工作正常,但不時說每3-4周的計數器將突然說1548到53(只是一個例子而不是字面的數字)下降 - 任何有想法的人爲什麼會發生這種情況?

錯誤日誌顯示:

PHP Warning: fread() [<a href='function.fread'>function.fread</a>]: Length parameter must be greater than 0 in /my/home/dir/www.mysite.com/count.php on line 6 
+0

因爲這段代碼不是線程安全的,而且看起來像是在文件被部分寫入但其他進程讀取它時捕獲了這些情況。你需要的是http://nz.php.net/flock(對不起,懶得寫完整的示例) – zerkms 2011-12-19 09:46:16

+0

可能的重複[如何保持此計數器重置爲100,000?](http://stackoverflow.com/questions/5250118 /如何對保本 - 抗衡來自-正在重置-AT-100-000) – SSpoke 2014-05-30 23:15:52

回答

1

長度參數必須大於0

嗯,是更大?

如果文件大小失敗,則返回false。 False被評估爲0.

如果在那一刻無法讀取文件,文件大小可能會失敗。我想這可能會發生,如果你有兩個同時點擊。其中一個正在寫文件,而另一個則試圖讀取它。 另一種可能性是文件大小可以讀取,但它是0,因爲另一個訪問者打開了該文件,但沒有寫入新的值。

所以要解決這個問題,您應該對文件應用鎖定,更好地處理和檢查這些函數的結果代碼,或者更好:將存儲移動到數據庫。

相關問題