0

[Linux 上的 PHP 7]

我正在尝试在几个异步运行的 PHP 脚本之间创建一个共享配置文件。

一种脚本是“作家”。它将知道何时有新的配置数据可用,并负责将此配置写入共享配置文件。没有其他脚本有权写入该文件。配置包含一个 JSON 字符串,应该写在单个 fwrite() 或 file_put_contents() 中。

数据太小了,引入数据库引擎或其他过于复杂的共享机制似乎有点过头了。

所有其他脚本(“阅读器”)需要能够随时打开文件并阅读内容,并确保内容完整(而不是在写入过程中)。

flock() 的问题在于,如果任何 Reader 打开文件并使用 LOCK_SH,则 Writer 无法获取文件上的 LOCK_EX,并且会阻塞。由于 Reader 会随机打开文件,因此可能存在重叠,并且可能永远不会出现所有 Reader 都释放文件的时间,因此 Writer 可能会无限期地等待而不会获得文件的排他锁。

Writer 必须能够在新配置适用时随时更新配置,但如果任何 Reader 在更新期间尝试打开配置(或正在读取现有文件),他们应该仍然看到之前的完整文件而不是空白或部分写入的文件。

最好将更新的配置写入临时文件,然后使用 rename() 替换现有文件?(rename() 在文件系统中执行时似乎是一个原子操作。

4

0 回答 0