2

我想更新一个文件,而其他进程可能正在读取它。PHPflock()函数正是允许这样做的。

然而,正如我所见,flock 只需要一个文件句柄 .. 这通常来自 fopen。如果我想有效地做到这一点,我不想保持文件打开并写入它,因为文件正在通过网络传输并且写入操作可能会持续几秒钟(比如 2-3 秒)。

所以我希望是否可以将数据写入临时文件然后移动它。在那种情况下,文件的读者只会在我重命名它时受到干扰。

现在将数据写入 temp 将不需要我使用flock。但是,如何使用锁定将临时文件正确移动到实​​际文件。

我还想知道我是否真的需要首先锁定......移动操作不会很快吗?它会伤害同时读取文件吗?而且我预计会有 100 次读取,但只有一次更新,并且该更新将每小时发生一次

4

1 回答 1

3

Rename 在 POSIX 系统中是原子的,所以你不需要flock。已经打开文件的读者不会受到干扰。(理由:打开的文件句柄指向 inode,而不是目录条目。重命名仅更改目录条目。)

但是,读者必须关闭并重新打开文件才能获取新内容。如果读者保持文件打开,他们将能够重新阅读旧内容。

于 2012-10-26T21:23:34.973 回答