为什么PHP文件追加只在99.7%的尝试中完全成功?


Why is PHP file append only wholly successful in 99.7% attempts

我有一个Javascript应用程序在各种平台上运行。
(我尽量保持客户端设备列表尽可能大,包括早期的Android手机和早期的iphone,使用caniuse.com)。

每次客户端应用程序的数据发生变化时,新数据都被添加到服务器上的纯文本日志文件中。附加内容是一个长度在20到70个字符之间的字符串。

<标题>

每隔一段时间——大约250次中有一次——追加的前6到20个字符擅离职守。

客户端设备上的JavaScript应用程序通过XmlHttpRequest将数据发送到Windows PC上的PHP 5.5.10,然后写入NAS挂载分区上的diskfile(在PC上挂载为Windows驱动器号)。

PHP在Windows 7的Mongoose web服务器上运行,然后数据存储在服务器网络上的国内网络附加存储设备的硬盘驱动器上。(一个Debian Linux NAS设备)NAS有时需要几秒钟来启动硬盘。

只有一个客户端设备正在处理任何给定的纯文本文件,但在任何给定时间,多达10个客户端设备可能正在访问各自的纯文本文件。

<标题>

如果我修复服务器+NAS组合上的延迟,它会消失吗?(例如,通过将文件放在本地服务器上)

或者是否有一种方法可以通过使用新的设施来保证写?例如,通过写入SQLite表而不是纯文本文件,或者Couchbase数据库或CouchDB或诸如此类的文件。

只要客户机设备的参与保持为简单的XmlHttpRequest,我就可以保持广泛的客户机设备。

我认为这里没有足够的信息,太多的系统和太少的信息。唯一的我能想到的是,这是一个并发问题。

如果你正在写一个磁盘上的文件,如果两个请求同时进来会发生什么?如果先读后写,可能会导致第二个请求被第一个请求覆盖。例如:

Process 1 receives data Y.
Process 2 receives data Z.
Process 1 reads data X from the disk.
Process 2 reads data X from the disk.
Process 1 writes to the disk, data is now XY
Process 2 writes to the disk, data is now XZ

本例中Y丢失。

如果你使用一个数据库(MySQL, Couch等),如果数据在读写之间发生了变化,它应该不那么重要。在很少的情况下,当我必须阅读和编辑某些东西时,我会使用

之类的查询语句。
UPDATE table SET data = "XY" WHERE data = "X"

这意味着如果数据在我读取X之后发生了变化,它不会更新字段,这是我可以在代码中观察和处理的东西。

关于fwrite的PHP文档说它是一个原子操作——要么什么都写,要么什么都不写。

这指出这是PHP中的一个错误。

我已经提交了一个bug报告。

关于工作回合有什么想法吗?

(在今天的测试中,没有一个写是部分的。12个丢失了,17个发生了乱序(即在客户发送信息的顺序不同的顺序中,总共42个)。