【问题标题】:How to encode large amount of data as json如何将大量数据编码为json
【发布时间】:2014-10-19 08:19:33
【问题描述】:

我需要能够将 json 从 php 传递到客户端,以便 javascript 可以解析代码并返回它。目前,我一直这样做的方式是:

<?php
    $mysql_query = $mysqli->query(QUERY GOES HERE);
    $array - array();
    while($row = $mysql_query->fetch_assoc()){
        array_push($array, $row);
    }
    $json =json_encode($array);
?>
<!-- javascript -->
<script>
    var json = <?php echo $json;?>;
    //...
</script>
<!--- rest of html --->

这通常有效。但是,查询返回超过 100,000 行,并且 php 当前在创建整个数组时内存不足。我看到有人说要使用ajax。这是唯一的方法吗?如果是这样,我将如何实施它?或者有没有更有效的方法将mysql数据编码成json而不用ajax?

谢谢

【问题讨论】:

  • 它是一个网络服务还是你想在你的网站上展示?
  • 我不知道为什么你一次需要数百万行,但你可以通过使用偏移量或定义 for 循环限制来制作查询块,并将它们存储在不同的数组中。真的不是一个好习惯。
  • 100K 行相当大。 PHP 数组本身会消耗大量内存,并且行可能会越来越大。如果您必须始终发送它们,请考虑SPL
  • @ahmed 本质上是在分析数据。用户提交到数据库,我指定日期范围,我想查看各个用户的数据。
  • @anwerjunaid 我需要根据不同的日期分析数据,根据范围,可以从几百到几千不等。 (这个具体的例子跨越了几个月)。我在想我也需要分块发送它,但是我将如何实现它以便 javascript 可以正常访问它们?我正在考虑的另一个解决方案是将信息写入 xml 文件,然后使用 json 解析它。这似乎是一个合理的解决方案,或者说是更好的解决方案?

标签: php json mysqli


【解决方案1】:

既然你说你也可以以块的形式发送你的数组,这意味着你可以在以多种方式整理数据的同时处理你的数据,我考虑这样做:

  • 获取小块的数据库数据(内存方面),在普通的 php 数组中。 这样做的方式是您 unset 先前分配的块以释放内存。
  • JSON 将您的部分数据编码为 HTML 元素。

像这样:

<input id="json-1" type="hidden" data-json='<?php echo json_encode($chunk[0]); ?>' />
<input id="json-2" type="hidden" data-json='<?php echo json_encode($chunk[1]); ?>' />
<input id="json-3" type="hidden" data-json='<?php echo json_encode($chunk[2]); ?>' />

是的,它看起来很丑,但请考虑一些优点:

  • 没有巨大的 javascript JSON 对象,占用客户端的内存
  • 您可以以渐进的方式解析数据,从而只消耗一部分内存

javascript 处理

 $(document).ready(function() {
    $("input[id^='json-']").each(function() {
       var json = $(this).data("json");

       // process the chunkied 'json'

       // remove the memory allocated (since you dont want anymore the huge data, probably)
       $(this).removeData(this,"json")
    });
 });

【讨论】:

  • 直到现在我才有机会尝试这个。现在服务器不再崩溃。谢谢你的方法!
【解决方案2】:

如果您想将某些内容从php 传递到javascript,则必须使用ajax,因为php 是服务器端,javascript 是客户端。

拥有 100,000 行的数组有点大,可能会导致问题。考虑将数组拆分成更小的块或限制查询。

您可以增加phps 的内存限制,但最好先优化数组。

【讨论】:

    【解决方案3】:

    您不需要处理如此大量的数据。 分页。

    【讨论】:

      猜你喜欢
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      相关资源
      最近更新 更多