php - 通过集群和移动进行高效的文件更新

标签 php concurrency rename flock

我想更新一个文件,而其他进程可能正在读取该文件。 PHP flock() 函数完全可以做到这一点。

但是,正如我所见,flock 只需要一个文件句柄..通常来自 fopen。如果我想高效地完成此操作,我不想保持文件打开并写入它,因为文件是通过网络传输的,写入操作可能会持续几秒钟(例如 2-3 秒)。

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

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

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

最佳答案

重命名在 POSIX 系统中是原子的,因此您不需要集群。已经打开该文件的读者将不会受到打扰。 (理由:打开的文件句柄指向 inode,而不是目录条目。重命名仅更改目录条目。)

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

关于php - 通过集群和移动进行高效的文件更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12978213/

相关文章:

go - 初学者级别代码的死锁

python - Pandas 系列名称

linux - Bash根据另一个文件中的行重命名多个文件

php - 什么是PHP高级语言的类别

php - 如何将简单的搜索查询传递到 URL 中?

php - 在 PHP 中使用 ISO-8859-1 编码拉丁字符

MySQL 无法重命名表

php - Mysql 的 UPDATE 查询总是将一个值设置为常量...?

multithreading - 每秒处理数百万个请求 : how does load balancer(main server thread) works

json - 我如何使用多个 JSON 文件到 Jmeter 5.1.1 的线程组/(bzm - 并发线程组)中进行并发测试?