我想更新一个文件,而其他进程可能正在读取该文件。 PHP flock()
函数完全可以做到这一点。
但是,正如我所见,flock 只需要一个文件句柄..通常来自 fopen。如果我想高效地完成此操作,我不想保持文件打开并写入它,因为文件是通过网络传输的,写入操作可能会持续几秒钟(例如 2-3 秒)。
所以我希望是否可以将数据写入临时文件,然后移动它。在这种情况下,只有当我重命名文件时,文件的读者才会受到干扰。
现在将数据写入临时文件不需要我使用flock。但是,如何使用锁定正确地将临时文件移动到实际文件。
我还想知道我是否真的需要首先锁定..移动操作不会很快吗?它会损害同时读取文件吗?我预计会有 100 次读取,但只有一次更新,并且该更新每小时发生一次
最佳答案
重命名在 POSIX 系统中是原子的,因此您不需要集群。已经打开该文件的读者将不会受到打扰。 (理由:打开的文件句柄指向 inode,而不是目录条目。重命名仅更改目录条目。)
但是,读者必须关闭并重新打开文件才能获取新内容。如果读者保持文件打开,他们将能够重新阅读旧内容。
关于php - 通过集群和移动进行高效的文件更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12978213/