我有一个在各种平台上运行的Javascript应用程序 (我尝试使用caniuse.com保持尽可能大的客户端设备列表,包括早期的Android手机和早期的iPhone)。
每次客户端应用程序的数据发生更改时,新数据都会附加到服务器上的纯文本日志文件中。附件是一个大约20个字符到70个字符的单个字符串。
每隔一段时间 - 大约250次中的一次 - 附加的前6到20个字符就是AWOL。
客户端设备上的JavaScript应用程序通过XmlHttpRequest将数据发送到Windows PC上的PHP 5.5.10,然后写入NAS的已安装分区上的磁盘文件(在PC上作为Windows驱动器号安装)。
PHP在Windows 7上的Mongoose Web服务器上运行,然后数据存储在服务器网络上的国内网络附加存储设备的硬盘上。 (Debian Linux NAS设备)NAS有时需要几秒钟才能启动硬盘。
只有一个客户端设备使用任何给定的纯文本文件,但在任何给定时间最多可能有10个客户端设备访问其各自的纯文本文件。
如果我修复服务器+ NAS组合上的延迟,它会消失吗? (例如,将文件本地放在服务器上)
或者有没有办法通过使用新设施来保证写入?例如,通过写入SQLite表而不是纯文本文件,Couchbase数据库或CouchDB或其他类似数据。
只要客户端设备的参与保持为简单的XmlHttpRequest,我就可以保留广泛的客户端设备。
答案 0 :(得分:0)
我不认为这里有足够的信息,系统太多,信息太少。我能想到的唯一的事情是它是一个并发问题。
如果您正在写入磁盘上的文件,如果两个请求同时进入会发生什么?如果你读,然后写,你最终可能会被第一个请求覆盖。例如:
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后数据发生了变化,它就不会更新字段,这是我可以在代码中观察和处理的内容。
答案 1 :(得分:0)
fwrite的PHP文档说它是一个原子动作 - 要么应该写入所有内容,要么不应写入任何内容。
这表明它是PHP中的一个错误。
我已提交错误报告。
关于工作轮次的任何想法?
(在今天的测试中,没有一个写入是部分的.12个失踪,17个发生无序 - 即与客户发送信息的顺序不同,总共42个)。