通过API获取数百万条记录

时间:2015-09-17 14:57:56

标签: php mysql json curl pdo

我通过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应用程序中,我尝试从一个表中获取20mln的记录,然后通过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条记录。这是唯一的方法吗?最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

你的主要问题是架构。

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

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

答案 1 :(得分:0)

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

您必须实现稳定的连接并每隔十万行推送数据,或者您可以通过cronjob准备一个文件(也是每一万行)并使用类似的方法传输此文件 filetransfer

如果你写一个文件,你可以"假" json-Array-Part" ["和"]"并且只是连接所有行。

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