计算文件中的命中数。计数有时从 0 重置

Counting hits in file. Count reset sometimes from 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);

我正在搜索,我正在使用 flock 阅读另一个 SO post。但是有时当天的文件会从0重新开始。不明白为什么。

我该如何解决这个问题?

谢谢!!!

请在 PHP 官方文档:http://php.net/manual/en/function.flock.php 上阅读更多关于 Flock 的信息,尤其是第一条评论。

当文件被锁定时,file_get_contents returns 什么都没有。

让我们尝试重现您的问题:

     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 and 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);