1

私は次のコードを使用しています:

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
4

1 に答える 1

1

長さパラメータは 0 より大きくなければなりません

そうですね?

ファイルサイズが失敗した場合、false を返します。False は 0 に評価されます。

その時点でファイルを読み取れない場合、filesize は失敗する可能性があります。2連打したらそうなるかも。そのうちの 1 人はファイルを書き込んでいますが、もう 1 人はそれを読み取ろうとしています。別の可能性として、ファイルサイズを読み取ることはできますが、別の訪問者がファイルを開いているが、まだ新しい値を書き込んでいないため、ファイルサイズが 0 になっている可能性があります。

したがって、これを回避するには、ファイルにロックを適用するか、これらの関数の結果コードの処理とチェックを改善するか、ストレージをデータベースに移動する必要があります。

于 2011-12-19T09:49:08.723 に答える