Javascript 将JSON保存到文件通常会中断
我试图找到anwser,但可能我没有使用正确的术语来解决我的问题,因此我需要在这里询问: 我制作了一个webapp,可以从JSON文件加载更大的对象数组。如有必要,用户将更新数组的某些部分、删除对象或推送新数据。 因此,当用户决定使用JQUERY AJAX将数组保存回JSON文件时,在处理数据的PHP中,我使用了“w+”标记,因此我删除了内容并写回了所有新的和修改过的内容 问题是,即使JSON文件由单个用户使用,有时在将整个内容写入清除的文件之前,写入过程也会中断。这将导致重要的数据丢失 //我确实为备份文件节省了安全性,但这意味着每次保存中断时,我都必须将最后一个备份JSON文件复制到webapp加载数据的原始JSON文件上,直到我这样做之前,没有人可以使用我的webapp 这是我在.js文件中的JQUERY AJAX:Javascript 将JSON保存到文件通常会中断,javascript,php,jquery,ajax,json,Javascript,Php,Jquery,Ajax,Json,我试图找到anwser,但可能我没有使用正确的术语来解决我的问题,因此我需要在这里询问: 我制作了一个webapp,可以从JSON文件加载更大的对象数组。如有必要,用户将更新数组的某些部分、删除对象或推送新数据。 因此,当用户决定使用JQUERY AJAX将数组保存回JSON文件时,在处理数据的PHP中,我使用了“w+”标记,因此我删除了内容并写回了所有新的和修改过的内容 问题是,即使JSON文件由单个用户使用,有时在将整个内容写入清除的文件之前,写入过程也会中断。这将导致重要的数据丢失 //我
$.ajax
({
url: 'json/save_json.php',
type: 'POST',
dataType : 'json',
data: { pid: currentdate, data: JSON.stringify(allinfobj), userlevel: jslevel},
complete: function(){alert("this worked out!")};
});
我的save_json.php:
<?php
$datecode = $_POST['pid'];
$myFile = "work".$datecode.".json";
$userData = $_POST['userlevel'];
if($userData != 4 && $userData != 3){
$fh = fopen($myFile, 'w+') or die("Error while opening the file.");
flock($fh, LOCK_EX); // acquire an exclusive lock
$stringData = $_POST['data'];
fwrite($fh, $stringData);
flock($fh, LOCK_UN);
fclose($fh);
}
?>
但有时我不明白的是,我的结果是:
[{"name":"Apple","color":"red","quality";"awful"};{"name":"Tesla","color":"met
因此,下次用户无法加载此JSON数据时,因为它缺少内容,并且永远不是正确的数组或JSON
a
pra+
在PHP中,我认为这不是一个解决方案,因为我经常需要替换或删除数组中较旧的JSON对象,因此我无法通过附加到现有数据来摆脱,或者新数组可能比旧数组短
仅供参考:在我的ajax调用中,success
和error
标记不会起任何作用。我不知道为什么complete
仍然有效,正如您所看到的,我在代码中使用了它
我希望我已经说得很清楚了,如果有人建议为什么写入JSON文件会中断,我将非常感激。我应该去哪里了解和解决这个问题<谢谢你因为您只编写文件,所以只需要
w
而不是w+
但我认为这不会解决这个问题
我认为您的服务器在您的POST
或GET
请求的大小上有限制
为了测试它,我建议您查看被破坏的JSON
字符串的大小是否与您在PHP
配置中设置的限制相同
请求的最大大小在PHP.INI
的max\u input\u vars
中设置
要测试PHP脚本中的数据是否正确,请尝试以下操作:
附加(在另一个文件中)您收到的JSON的大小。当它崩溃时,查看断开的JSON字符串的大小是否与您在另一个文件中写入的长度相同
此外,您还可以通过JS发送JSON
字符串的客户端长度。然后,您可以将reiceve长度与您在reiceve字符串上计算的长度进行比较
这将有助于区分问题是客户端还是服务器端。在将Post数据保存到文件之前,检查Post数据是否未被截断。 如果Json数据正在增长,请检查post_max_size。 保存文件时,请尝试将w+模式更改为c模式。w+可以截断文件 此链接也可以帮助您:
谢谢,我会尝试一下,但是新的JSON文件在中断发生后,非常短,很难相信这就是原因所在。同样,在用备份文件(大小大致相同)替换JSON文件后,即使它再获得10或20KB的新数据,它也会工作数天。向文件中写入任意代码非常容易。如果我发送一个pid,如
some_file.php\0
(其中\0
是空字符),会发生什么情况然后作为data
放入一些PHP
code。您可能认为攻击者不知道文件名中的前缀work
字符串。但是在read_json.php
中可以通过做同样的事情并读取异常结果来猜测它。你完全正确。不过,我现在想重点讨论数据中断fenomenon,然后当然是提高安全性,但指出这种不安全性无疑是好的。它看起来像是将w+/code>更改为c
,然后使用ftruncate($fh,0)
和fflush($fh)获得独占锁
修复了该问题,因为在超过24小时的密集使用后,部分截断问题没有出现。目前,我将把这个标记为正确答案。我对所有答案都投了赞成票,因为它们或多或少都帮助我理解了这个问题。非常感谢。
[{"name":"Apple","color":"red","quality";"awful"};{"name":"Tesla","color":"met