多个用户写入文件如何导致损坏?

How can multiple users writing to a file cause corruption?

我制作了一个聊天室,使用 PHP 写入文本文件,然后将文本文件读取给用户。我多次被告知,如果多个用户同时写入我服务器上的同一个文件,该文件可能会损坏。

这是怎么造成的,又是如何发生的?

这与 PHP 无关,但与文件在驱动器上的存储方式以及操作系统读取和写入文件的方式有关。

硬盘驱动程序具有一些优化自身性能的智能。但归根结底,它们只是愚蠢的机器。

如果一个进程(或两个或更多)要求 OS 将大量数据(来自用户 A 的大 post)写入文件,驱动程序可能希望将这些数据分解成几个块(匹配设备的块大小)以优化 HDD 性能。写一个块需要时间。即使只是几分之一秒,它仍然是一个持续时间,在此期间另一个进程可能会出现并要求 OS 向同一文件描述符写入其他内容(来自用户 B 的简短问候语)。 OS 不够智能,无法理解您的应用程序的意图,它只是遵循它发出的指令。并写入用户B的数据。然后它继续写入用户 A 的下一个数据块。这导致以下数据存储在文件中:

用户 A 的 post 用户 A 的 post 用户 A 的 post 用户 A 的 post 用户 B 的 QUICKY 用户 A 的 post 用户 A 的 post用户 A 的 post

乍一看这可能没什么害处,但是如果您加入多字节字符编码呢?用户 A 的块的末尾可能出现在一个字符的中间,这将使其难以辨认且几乎无法恢复。