2011-12-19 5 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); 
} 

これは正常に動作しますが、すべてはそれほど頻繁にヒットカウンタが突然53に1548と言うから(一例に過ぎないリテラル番号)をドロップします3~4週間と言います - なぜこれが起こっているのか、アイデアを持っている人は誰ですか?

エラーログを示しています

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

+0

[このカウンタを100,000でリセットしないようにするには?](http://stackoverflow.com/questions)/5250118/how-to-keep-this-counter-from-reseting-at-100-000) – SSpoke

答えて

1

Lengthパラメータが0

よりも大きくなければならない。まあ、それはありますか?

filesizeに失敗すると、falseを返します。 Falseは0と評価されます。

ファイルがその瞬間に読み取れない場合、ファイルサイズが失敗する可能性があります。私はあなたが2つのヒットを同時に得た場合に起こるかもしれないと想像します。そのうちの1人はファイルを書き込んでいますが、もう1人はファイルを読み込もうとしています。 もう1つの可能性は、ファイルサイズがの場合はとなりますが、別の訪問者がファイルを開いたがまだ新しい値を書き込んでいないため、0です。

これを回避するには、ファイルにロックを適用し、その機能の結果コードをより適切に処理したり、チェックしたりする必要があります。ストレージをデータベースに移動します。

関連する問題