将JSON保存到文件经常会中断
Saving JSON to file often breaks
我试图找到一个wser,但可能我没有使用正确的术语来解决我的问题,所以我需要在这里问:
我制作了一个Web应用程序,从JSON文件中加载更大的对象数组如有必要,用户将更新数组的某些部分、删除对象或推送新数据
正因为如此,当用户决定用JQUERY AJAX将数组保存回JSON文件时,在我处理数据的PHP中,我会使用"w+"标记,因此我会删除内容并写回所有新的和修改过的内容。
问题是即使JSON文件由单个用户使用,有时在将整个内容写入清除的文件之前,写入过程就会中断。这导致了重要的数据丢失。
//我确实为备份文件节省了安全性,但这意味着每次保存中断时,我都必须将最后一个备份JSON文件复制到Web应用程序加载数据的原始JSON文件上,在我这样做之前,没有人可以使用我的Web应用程序。
这是我在.js文件中的JQUERY AJAX:
$.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);
}
?>
我在那里使用某些变量,比如$userData或$datecode。这些与fwrite断开这一事实无关。希望它不会让任何人感到困惑,我向你保证这些工作很好。
生成的JSON文件通常类似于:
[{"name":"Apple","color":"red","quality";"awful"};{"name":"Tesla","color":"metallic","quality";"improved"};{"name":"Shoe","color":"white","quality";"fake"};{"name":"Glass","color":"undefined","quality";"good"};{"name":"Jessica","color":"private","quality";"private"}]
但有时我的结果是,因为一个我不理解的休息:
[{"name":"Apple","color":"red","quality";"awful"};{"name":"Tesla","color":"met
因此,下次用户无法加载此JSON数据时,因为它缺少内容,而且永远不是正确的数组或JSON。
我认为PHP中的a
pr a+
不是一个解决方案,因为我经常需要替换或删除数组中较旧的JSON对象,这样我就无法通过附加到现有数据来逃脱惩罚,或者新数组可能比旧数组更短。
仅供参考:在我的ajax调用中,success
和error
标签不会起任何作用。我不知道为什么。complete
是有效的,正如您所看到的,我在代码中使用了它。
我希望我把我自己说得很清楚,如果有人建议我为什么写JSON文件会失败,我将不胜感激。我应该在哪里了解和解决这个问题谢谢你
在将Post数据保存到文件之前,请检查其是否未被截断。如果Json数据正在增长,请检查post_max_size。保存文件时,也可以尝试将w+更改为c模式。w+可以截断文件。
http://us3.php.net/manual/en/function.fopen.php
这个链接也可以帮助你:
fopen(file,w+)在我可以检查它是否';s用flock()锁定
由于您只编写文件,因此您只需要w
而不是w+
。
但我认为这不会解决问题。
我认为您的服务器对POST
或GET
请求的大小有限制。
为了测试它,我建议您查看断开的JSON
字符串的大小是否与您在PHP
配置中设置的限制相同。
在PHP.INI
的max_input_vars
中设置请求的最大大小。
要测试数据是否正确进入PHP脚本,请尝试以下操作:附加(在另一个文件中)您收到的JSON的大小。当它崩溃时,查看断开的JSON字符串的大小是否与您在其他文件中写入的长度相同。
此外,您还可以通过JS发送JSON
字符串的客户端长度。然后,您可以将reiceved长度与您在reiceve字符串上计算的长度进行比较。
这将有助于区分问题是客户端还是服务器端。
- 高亮显示与数组字符串一起使用时文本插件中断
- AngularJS ui路由器html5模式中断路由
- 递归函数中断
- Javascript-在文本区域中断,但不在段落中中断
- 在内部映射值时渲染方法中断
- 中断功能
- 使用ajax获取通过FTP上传的文件的文件大小——试图防止ajax中断自身
- 遇到错误后,更改检测似乎中断
- 我如何防止错误“;未捕获(在promise中)DOMException:play()请求被对pause()的调用中断&”
- NG-重复中断指令模型绑定
- 三元条件中出现意外的令牌中断
- 中断javascript循环
- 包含数组的对象的QML ListModel追加中断
- dojoConfig中的CacheBust中断路径
- 在JavaScript中中断forEach方法的首选方法
- 当使用return语句时,循环不会中断
- 即使被信号处理程序中断,node.js代码也会一直运行到完成吗
- javascript在其中设置空格时会中断
- console.assert失败时中断chrome调试器
- 在onmouseover事件中更改图像,并为每个事件设置中断/间隔