2017-07-12 10 views
-1

から時々リセットカウント私はこのコードを使用して、ファイルに一日あたりのヒット数をカウントしています:ファイル内のヒットをカウントします。 0

// Stats 
$filename = "./stats/".date("Y-m-d").".txt"; 
$number = file_get_contents($filename); 
$f = fopen($filename, 'a'); 
if(flock($f, LOCK_EX | LOCK_NB)) { 
    ftruncate($f, 0); 
    fwrite($f, $number+1); 
    flock($f, LOCK_UN); 
} 
fclose($f); 

私が探していたと私は別のSOポストに読んで、私はflockを使用しています。しかし時には今日のファイルは0から再開することがあります。理由を理解できません。

どうすればこの問題を解決できますか?

ありがとうございます!

+0

'しかし、0 'から、時には、現在の日のファイルは再起動: - そして、あなたはどのようにお見せしなければなりません生成された現在の日付ファイルとその中にカウンタをどのように置いたかを示します。 –

+0

@AlivetoDie質問のコードは、私が使用するコードです。 –

+0

私はtxtファイルを何度もチェックします。問題はそれがときどき0にリセットされるということです。今度は3756ですが、別の時間の後にはより低い数字または0です... –

答えて

0

Flockについては、PHPの公式ドキュメントhttp://php.net/manual/en/function.flock.php(特に最初のコメント)をお読みください。

ファイルがロックされている間に、file_get_contentsは何も返しません。

のはあなたの問題を再現してみましょう:

 PROCESS 1 
-------------------- 
-- fgetcontents -- 
--  fopen  --    PROCESS 2 
--  lock  --  -------------------- 
-- truncate --  -- fgetcontents -- => NULL (file locked) 
-- put number+1 --  --  fopen  -- 
-- unlock  --  --  lock  -- 
-- fclose  --  -- truncate  -- 
--------------------  -- put number+1 -- => 1 
          --  unlock  -- 
          --  fclose  -- 
          -------------------- 

あなたはまたfflushを使用して、最後に出力バッファをフラッシュすることができます。この関数は、バッファされたすべての出力をファイルハンドルが指すリソースに強制的に書き込みます。 (http://php.net/manual/ro/function.fflush.phpおよびExplanation of PHP's fflush() function)。

私はそれはあなたが(それをロックした後、ファイルの内容を読んで)必要なものだと思う:

$f = fopen("file.txt", "a+"); 
if(flock($f, LOCK_EX | LOCK_NB)) { 
    $number = fgets($f); 
    ftruncate($f, 0); 
    fwrite($f, $number+1); 
    flock($f, LOCK_UN); 
} 
fclose($f); 
関連する問題