我通过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条记录。这是唯一的方法吗?最好的方法是什么?
答案 0 :(得分:0)
你的主要问题是架构。
显然不的最佳方法是拥有一个API,需要在每次调用时传输数十亿行。
实现一个方法只检索一行,适合API,或重新考虑整个架构。比如,磁盘复制或数据库复制等。
答案 1 :(得分:0)
你绝对不应该使用fetchAll,因为它只会填满你的记忆。您确定每次都需要完整的数据传输吗?通常只需要转移差异。这当然会使您的API更加复杂。
您必须实现稳定的连接并每隔十万行推送数据,或者您可以通过cronjob准备一个文件(也是每一万行)并使用类似的方法传输此文件 filetransfer
如果你写一个文件,你可以"假" json-Array-Part" ["和"]"并且只是连接所有行。
你确定json是正确的格式吗?如果你只有一列,那么结构确实不多。