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

时间:2014-04-09 08:32:27

标签: javascript php jquery ajax json

我试图找到anwser,但也许我没有使用正确的条款来解决我的问题,所以我需要在这里问:

我制作了一个webapp,可以从JSON文件中加载更大的对象数组。如果需要,用户将更新数组的某些部分,删除对象或推送新数据。< /强>

由于这个当用户决定用JQUERY AJAX将数组保存回JSON文件时,在我处理数据的PHP中,我使用'w +'标记,所以我删除了内容并回写全新的和修改过的内容。

问题是即使单个用户使用JSON文件,有时写入过程会在整个内容写入该已清除文件之前中断。这可以避免重要的数据丢失。

//我确实为备份文件节省了安全费用,但这意味着每次保存中断时我必须将最后一个备份JSON文件复制到原始JSON文件中,webapp加载数据,直到我这样做,没有人可以使用我的webapp。

这是我在.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文件会中断的建议。我应该在哪里了解并解决这个问题。 谢谢你!

2 个答案:

答案 0 :(得分:1)

由于您只编写文件,因此您只需要w而不是w+

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

我认为您的服务器的POSTGET请求数量有限制。

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

请求的最大大小设置为max_input_vars的{​​{1}}。

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

此外,您可以通过JS发送PHP.INI字符串的客户端长度。然后,您可以将重新测量的长度与您在预期的字符串上计算的长度进行比较。

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

答案 1 :(得分:1)

在将Post数据保存到文件之前,请检查Post数据是否未被截断。 如果您的Json数据正在增长,请检查post_max_size。 保存文件时,也可以尝试将w +更改为c模式。 w +可以截断文件。

http://us3.php.net/manual/en/function.fopen.php

此链接也可以为您提供帮助:

fopen(file,w+) truncates the file before I can check if it's locked with flock()