我使用以下代码计算文件中每天的点击次数:
// 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)
请阅读有关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.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);