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

时间:2017-07-12 04:22:51

标签: php file flock

我使用以下代码计算文件中每天的点击次数:

// 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开始重新开始。不明白为什么。

我该如何解决这个问题?

谢谢!!!

1 个答案:

答案 0 :(得分:0)

请阅读有关PHP官方文档Flock的更多信息: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.phpExplanation 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);