Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么PHP文件附加只在99.7%的尝试中完全成功_Javascript_Php_Logging_Cross Browser_Cross Platform - Fatal编程技术网

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

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,然

我有一个Javascript应用程序在各种平台上运行。
(我尝试使用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()发布。这将使所有写入要么成功,要么完全失败。(与当前情况相反,在当前情况下,它们偶尔会部分失败)