通过API获取数百万条记录


Fetching millions of records through API

我有一个API调用从我的应用程序到我的其他应用程序通过cURL,传递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条记录而不是抓取所有记录。这是唯一的办法吗?最好的方法是什么?

你的主要问题是架构。

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

要么实现只检索一行的方法,这是适合API的,要么重新考虑整个体系结构。例如,磁盘复制或数据库复制等

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

您要么必须实现一个稳定的连接并每一万行推送您的数据,要么您可以通过cronjob准备一个文件(也是每一万行),并使用下面的方法传输该文件filetransfer

如果你写一个文件,你可以"伪造"json-Array-Part"["answers"]",然后把所有的行连接起来。

你确定json是正确的格式吗?如果你只有一列,那就没有太多的结构了。