读写文件时保持锁定状态

12

我正在制作一个简单的页面加载计数器,通过将当前计数存储在文件中来实现。这是我想要做的:

  1. 锁定文件(flock)
  2. 读取当前计数(fread)
  3. 增加计数(++)
  4. 写入新计数(fwrite)
  5. 解锁文件/关闭文件(flock/fclose)

是否可以在不失去锁定的情况下完成此操作?

据我所知,如果没有失去锁定,文件是无法被写入的。为了解决这个问题,我想到的唯一方法是使用“r+”模式写入一个字符,然后计算字符数量。


每页只有一个字符的加载其实可以很有趣 :) 观察那个文件增长... - Markus Hedlund
3个回答

24

如前所述,您可以使用FLock。以下是一个简单示例:

//Open the File Stream
$handle = fopen("file.txt","r+");

//Lock File, error if unable to lock
if(flock($handle, LOCK_EX)) {
    $count = fread($handle, filesize("file.txt"));    //Get Current Hit Count
    $count = $count + 1;    //Increment Hit Count by 1
    ftruncate($handle, 0);    //Truncate the file to 0
    rewind($handle);           //Set write pointer to beginning of file
    fwrite($handle, $count);    //Write the new Hit Count
    flock($handle, LOCK_UN);    //Unlock File
} else {
    echo "Could not Lock File!";
}

//Close Stream
fclose($handle);

1
谢谢,ftruncate 就是我要找的! - Markus Hedlund
1
ftruncate并没有像预期那样工作,但是rewind解决了问题。 - Markus Hedlund
3
在我的情况下,我必须在 ftruncate($handle, 0) 之后使用 rewind($handle) - bingjie2680

4
我相信你可以使用flock来实现这个功能。打开一个指向你的文件的指针,flock它,读取数据,写入数据,然后关闭(关闭会自动解锁)。 http://php.net/flock

是的,我知道flock,但不知道如何在写入时保持锁定。 - Markus Hedlund
锁定将一直保持,直到您解锁、关闭文件或脚本终止。 - Adam Hopkinson
2
自5.3.2版本以来,不再自动解锁。 - Tertium

3

是的,在使用ftruncate之前必须使用rewind。否则,文件的旧内容仅被重新填充为零。

工作顺序如下:

    fopen
    flock LOCK_EX
    fread filesize
    rewind
    ftruncate 0
    fwrite 
    flock LOCK_UN
    fclose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接