将JSON保存到文件经常会中断

Saving JSON to file often breaks

本文关键字:常会 中断 存到文件 JSON      更新时间:2023-09-26

我试图找到一个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调用中,successerror标签不会起任何作用。我不知道为什么。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+

但我认为这不会解决问题。

我认为您的服务器对POSTGET请求的大小有限制。

为了测试它,我建议您查看断开的JSON字符串的大小是否与您在PHP配置中设置的限制相同。

PHP.INImax_input_vars中设置请求的最大大小。

要测试数据是否正确进入PHP脚本,请尝试以下操作:附加(在另一个文件中)您收到的JSON的大小。当它崩溃时,查看断开的JSON字符串的大小是否与您在其他文件中写入的长度相同。

此外,您还可以通过JS发送JSON字符串的客户端长度。然后,您可以将reiceved长度与您在reiceve字符串上计算的长度进行比较。

这将有助于区分问题是客户端还是服务器端。