我想要更新一个文件,而其他进程可能正在读取它。PHP的flock()函数正好可以做到这一点。
但是,在我看来,flock只接受一个文件句柄..这通常来自于fopen。如果我想高效地这样做,我不想让文件保持打开并写入它,因为文件是通过网络传入的,写入操作可能会持续几秒钟(比如2-3秒)。
所以我希望可以将数据写入临时文件,然后移动它。在这种情况下,只有当我重命名该文件时,该文件的读者才会受到干扰。
现在,将数据写入temp将不需要我使用flock。但是,如何使用锁定将临时文件正确地移动到实际文件。
我还想知道我是否真的需要锁定。移动操作不是会很快吗?会不会影响到文件的同步读取。我预计会有100次读取,但只有一次更新,而且更新将每小时进行一次
发布于 2012-10-27 05:23:35
Rename在POSIX系统中是原子的,所以不需要flock。已经打开该文件的读取器将不会受到干扰。(对齐方式:打开的文件句柄指向inode,而不是目录条目。重命名仅更改目录条目。)
但是,读者必须关闭并重新打开文件才能获得新内容。如果读者保持文件处于打开状态,他们将能够重新读取旧内容。
https://stackoverflow.com/questions/12978213
复制相似问题