代码之家  ›  专栏  ›  技术社区  ›  Markus Hedlund

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

  •  8
  • Markus Hedlund  · 技术社区  · 16 年前

    我正在通过将当前计数存储在一个文件中来创建一个简单的页面加载计数器。我想这样做:

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

    这能在不丢失锁的情况下完成吗?

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

    3 回复  |  直到 12 年前
        1
  •  19
  •   user1202136    12 年前

    如前所述,你可以使用羊群。一个简单的例子是:

    //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);
    
        2
  •  3
  •   Adam Hopkinson    16 年前

    我相信你能用 flock .打开指向文件的指针, 一大群 它,读取数据,写入数据,然后关闭(关闭自动解锁)。

    http://php.net/flock

        3
  •  1
  •   Jason    14 年前

    是的,你以前必须用倒带 ftruncate . 否则,文件的旧内容只能用零填充。

    工作顺序为:

        fopen
        flock LOCK_EX
        fread filesize
        rewind
        ftruncate 0
        fwrite 
        flock LOCK_UN
        fclose
    
    推荐文章