2015-09-17 4 views
1

У меня есть вызов API от моего приложения к моему другому приложению через локон, передавая переменный POST, например, так:Извлечение миллионов записей через API

$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 приложения я пытаюсь принести 20 млн записей из один стол, а затем передать его через 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 записей вместо того, чтобы получать все. Это единственный способ? Каков наилучший способ сделать это?

+0

Я думаю, у вас есть две (или многие другие) опции, сделать более маленькие звонки или, как правило, вы можете подумать о rsync через ssh (или sftp) – swidmann

+0

Расскажите больше о архитектуре и почему вы хотите ее создать. Мой первый квест - синхронизация данных. Я понимаю, что у вас есть два отдельных приложения, но у вас также есть два разделенных сервера баз данных? если у вас есть две разделенные базы данных и нужна синхронизация данных, вам необходимо использовать репликацию базы данных или механизм хранения FEDERATED (https://dev.mysql.com/doc/refman/5.1/en/federated-storage-engine.html) –

ответ

0

Ваша основная проблема - архитектура.

Лучшим способом является, видимо, не, чтобы иметь API, который требует передачи рядов zillions при каждом вызове.

Либо реализовать метод для извлечения только одной строки, подходящей для API, либо пересмотра всей архитектуры. Скажем, репликация диска или репликация базы данных или такая.

+0

Одна строка в то время звучит очень неправильно для меня. – flaschenpost

0

Вам определенно не следует использовать fetchAll, так как он просто заполняет вашу память. Вы уверены, что вам нужна полная передача данных каждый раз? Часто нужно просто переносить различия. Это, конечно, делает ваш API намного сложнее.

Вы должны либо осуществлять стабильное соединение и нажмите данные каждого tenthousand строки или вы могли бы подготовить файл (также каждое tenthousand строк) по cronjob и перенести этот файл с помощью метода, как filetransfer

Если вы пишете файл, вы могли бы «подделать» json-Array-Part «[» и «]» и просто конкатрировать все ваши строки.

Вы уверены, что json - правильный формат? Если у вас всего один столбец, на самом деле не так много структуры.

Смежные вопросы