【问题标题】:Fetching millions of records through API通过 API 获取数百万条记录
【发布时间】:2015-12-14 12:21:06
【问题描述】:

我的应用程序通过 cURL 向我的其他应用程序调用 API,传递 POST 变量,如下所示:

$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_URL => $url,
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => $paramString,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_TIMEOUT => 600,
    CURLOPT_CONNECTTIMEOUT => 60,
));

在这个 $url 应用程序中,我尝试从一个表中获取 2000 万条记录,然后通过 JSON 传递它,如下所示:

public function apiMethod()
{
   $response = $this -> _db -> fetchAll('SELECT t.hash FROM table t WHERE id BETWEEN 20000000 AND 40000000;');
   echo json_encode($response);
}

当然使用 PDO。

好的,这有两个问题: 1. FetchAll() 不适用于这么多记录 - 内存超出。 2. Json 不能处理这么多记录 - json 有最大大小。

我一直在考虑多次调用 cURL 并每次都获取,比如 100,000 条记录,而不是全部获取。这是唯一的方法吗?最好的方法是什么?

【问题讨论】:

  • 我认为您有两个(或更多)选项,进行更多较小的调用,或者通常您可以考虑通过 ssh(或 sftp)进行 rsync
  • 详细介绍该架构以及您为什么要创建它。我的第一个任务是数据同步。我了解您有两个独立的应用程序,但您是否也有两个独立的数据库服务器?如果您有两个独立的数据库并且需要数据同步,则需要使用数据库复制或 FEDERATED 存储引擎 (dev.mysql.com/doc/refman/5.1/en/federated-storage-engine.html)

标签: php mysql json curl pdo


【解决方案1】:

您的主要问题是架构。

显然,最好的方法是拥有一个需要在每次调用时传输无数行的 API。

要么实现一个只检索一行的方法,这适用于 API,要么重新考虑整个架构。比如说,磁盘复制或数据库复制等等。

【讨论】:

    【解决方案2】:

    你绝对不应该使用 fetchAll,因为它只会填满你的记忆。您确定每次都需要完整的数据传输吗?通常只需要转移差异。这当然会使您的 API 更加复杂。

    您要么必须实现稳定的连接并每 100 行推送一次数据,要么可以通过 cronjob 准备一个文件(也可以每 1000 行)并使用类似的方法传输此文件 filetransfer

    如果你写一个文件,你可以“伪造”json-Array-Part“[”和“]”,然后连接所有行。

    你确定 json 是正确的格式吗?如果你只有一列,那么结构并不多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      • 2023-01-31
      • 2015-07-14
      相关资源
      最近更新 更多