Javascript 为什么PHP文件附加只在99.7%的尝试中完全成功
我有一个Javascript应用程序在各种平台上运行。Javascript 为什么PHP文件附加只在99.7%的尝试中完全成功,javascript,php,logging,cross-browser,cross-platform,Javascript,Php,Logging,Cross Browser,Cross Platform,我有一个Javascript应用程序在各种平台上运行。 (我尝试使用caniuse.com尽可能多地列出客户端设备,包括早期的Android手机和早期的iPhone) 每次客户端应用程序的数据更改时,新数据都会附加到服务器上的纯文本日志文件中。附录是一个大约20到70个字符的字符串 问题 每隔一段时间(大约250个字符中有一次),追加的前6到20个字符就会擅离职守 客户端设备上的JavaScript应用程序通过XmlHttpRequest将数据发送到Windows PC上的PHP5.5.10,然
(我尝试使用caniuse.com尽可能多地列出客户端设备,包括早期的Android手机和早期的iPhone) 每次客户端应用程序的数据更改时,新数据都会附加到服务器上的纯文本日志文件中。附录是一个大约20到70个字符的字符串 问题 每隔一段时间(大约250个字符中有一次),追加的前6到20个字符就会擅离职守 客户端设备上的JavaScript应用程序通过XmlHttpRequest将数据发送到Windows PC上的PHP5.5.10,然后写入NAS已装入分区上的磁盘文件(作为Windows驱动器号装入PC) PHP在Windows7上的MongooseWeb服务器上运行,然后数据存储在服务器网络上的家庭网络连接存储设备的硬盘上。(Debian Linux NAS设备)NAS有时可能需要几秒钟来启动硬盘 只有一个客户端设备正在处理任何给定的纯文本文件,但在任何给定时间,最多可能有10个客户端设备正在访问各自的纯文本文件 问题 如果我修复服务器+NAS组合上的延迟,它会消失吗?(例如,通过将文件本地放置在服务器上) 或者有没有一种方法可以通过使用新的工具来保证写入?例如,通过写入SQLite表,而不是纯文本文件,或Couchbase db或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、Coach等),那么数据在读写之间是否发生了变化就不那么重要了。在极少数的情况下,我必须阅读一些东西并编辑那些确切的东西,我会使用一个查询来查询一些东西
UPDATE table SET data = "XY" WHERE data = "X"
这意味着,如果在我读取X后数据发生更改,它不会更新字段,这是我可以在代码中观察和处理的。我认为这里没有足够的信息,系统太多,信息太少。我唯一能想到的是这是一个并发问题 如果您正在写入磁盘上的文件,如果两个请求同时传入,会发生什么情况?如果先读后写,第二个请求可能会被第一个请求覆盖。例如:
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、Coach等),那么数据在读写之间是否发生了变化就不那么重要了。在极少数的情况下,我必须阅读一些东西并编辑那些确切的东西,我会使用一个查询来查询一些东西
UPDATE table SET data = "XY" WHERE data = "X"
这意味着,如果数据在我读取X后发生更改,它不会更新字段,这是我可以在代码中观察和处理的内容。fwrite的PHP文档说这是一个原子操作——要么所有内容都应该写入,要么什么内容都不应该写入 这表明它是PHP中的一个bug 我已经提交了一份bug报告 关于工作轮有什么想法吗
(在今天的测试中,没有一次写入是局部的。12次丢失,17次出错-即,与客户端发送信息的顺序不同,总共42次)。fwrite的PHP文档说这是一个原子操作-要么所有内容都应该写入,要么什么内容都不应该写入 这表明它是PHP中的一个bug 我已经提交了一份bug报告 关于工作轮有什么想法吗 (在今天的测试中,没有一次写入是部分写入。12次丢失,17次发生故障-即,在总共42次写入中,与客户发送信息的顺序不同)。我更改了fopen($filename,“a”);fwrite($stuff);fclose()序列到文件内容($filename,$stuff,file_APPEND | LOCK_EX)这会向进程添加一个隐式文件锁,由fclose()发布。这将使所有写入要么成功,要么完全失败。(与当前的情况相反,它们偶尔会部分失败)我更改了fopen($filename,“a”);fwrite($stuff);fclose()序列到文件内容($filename,$stuff,file_APPEND | LOCK_EX)这会向进程添加一个隐式文件锁,由fclose()发布。这将使所有写入要么成功,要么完全失败。(与当前情况相反,在当前情况下,它们偶尔会部分失败)