在 php 中从服务器获取 json 数据时允许的 1073741824 字节内存耗尽(尝试分配 80 字节)

Allowed memory size of 1073741824 bytes exhausted (tried to allocate 80 bytes) while fetching json data from server in php

我正在尝试从服务器以 [​​=25=] 格式从数据库中获取大约 500000 行的大量数据,并出现内存耗尽错误。当我尝试 100 行时一切正常,但我需要一次性获取 500000 行。我正在使用邮递员扩展来获取这些数据。伙计们,我不是数据库的冠军,但我试了一整天,发现了一些有用的提示 this this this 等等,但运气不好。

我知道这不是一个好的解决方案,但我也试过了 ini_set('memory_limit', '-1');

这就是我正在做的事情:

 $response["data"] = array();

        $result = $db->getData();
        while ($data= $result->fetch_assoc()) {
         array_push($response["data"], $data);
             }

          file_put_contents('newData.json', json_encode($response,128));
        echoRespnse(200, $response);

我花了 1 天时间尝试了将近 100 种解决方案,但没有成功,我也知道这已发布多次,但我认为我的问题有点不同。请提出您宝贵的建议,我们将不胜感激。

无论您尝试在客户端对 50 万条记录执行什么操作,请尝试在服务器端执行。如果你只是需要显示它们,你可以考虑分页。获取类似于前 1000 条记录(例如 LIMIT 1000)的内容,让用户浏览其余的内容。

这里有一些伪代码供您使用:

while (there are rows to get) {
   rows = get the next 1000 rows
   write down the rows
}

它适用于任何语言,只需调整 id :D

如果您在从数据库中读取行时将 JSON 直接输出到文件,则使用的内存会少得多。例如,您可以先输出 {"data":[ 以开始 json,然后输出由 json_encode 编码的每一行,但用逗号分隔。最后,用 ]}

关闭 JSON

现在您的 json 已保存在文件中,您可以 rewind to the start, and use fpassthru 将其作为回复发送。

这样,您就可以处理任意大的响应,因为您永远不需要将整个响应都保存在内存中。

处理如此大的 JSON 文件完全是另一回事:)

感谢所有花时间在这里的人,现在我的一部分问题解决了。所以我认为解决方案必须在这里,通过这个解决方案,您可以一次获取(或显示到浏览器中)1 lac 到 15 lac 行 json 的形式。

$result = mysql_query($sql);
if(mysql_num_rows($result)){
    echo '{"data":[';

    $rkt= true;
    $my_row=mysql_fetch_assoc($result);
    while($my_row=mysql_fetch_row($result)){
        if($rkt) {
            $rkt= false;
        } else {
            echo ',';
        }
        echo json_encode($my_row);
    }
    echo ']}';
} else {
    echo '[]';
}

现在尝试解决第二部分,“如何将所有 json 数据复制到 .json 文件”,这样我就可以下载了

此处 file_put_contents('MyFileName', json_encode($my_row)); 无法使用上述方法。

已编辑(已解决): 可能可以以更健壮和干净的方式对其进行改进。但是这个也对我有用,这里是完整的代码,可以获取大量数据(大约 12 行 lac)并将其写入 .json 文件而不会失败。

$result = mysql_query($sql);
$arr = array();

if(mysql_num_rows($result)){
    echo '{"data":[';
      $arr[] = '{"data":[';

    $rkt= true;

    while($my_row=mysql_fetch_row($result)){
        //  cast results to specific data types

        if($rkt) {
            $rkt= false;
        } else {
            echo ',';
 $arr[] = ',';

        }
$robi_json = json_encode($my_row,200);
$arr[] = $robi_json;

echo $robi_json;


    }

    echo ']}';
$arr[] = ']}';
file_put_contents('data_file.json', $arr);
} else {
    echo '[]';
}

感谢大家指点迷津,特别感谢Paul Dixon