在保持锁定的同时读取和写入文件

时间:2010-03-15 22:15:29

标签: php file locking

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

  1. 锁定文件(flock)
  2. 读取当前计数(fread)
  3. 增加它(++)
  4. 写新计数(fwrite)
  5. 解锁文件/关闭它(flock / fclose)
  6. 这可以在不失去锁定的情况下完成吗?

    据我了解,在不丢失锁定的情况下无法写入文件。我想出解决这个问题的唯一方法是使用“r +”模式编写一个字符,然后计算字符数。

3 个答案:

答案 0 :(得分:19)

如上所述,你可以使用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 :(得分:3)

我相信你可以使用flock实现这一目标。打开指向文件的指针flock,读取数据,写入数据,然后关闭(关闭自动解锁)。

http://php.net/flock

答案 2 :(得分:1)

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

工作顺序是:

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