为什么PHP文件仅在99.7%的尝试中完全成功

时间:2015-10-07 16:20:49

标签: javascript php logging cross-browser cross-platform

我有一个在各种平台上运行的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,我就可以保留广泛的客户端设备。

2 个答案:

答案 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个)。