2014-02-09 2 views
0

у нас есть следующая потенциальная ситуация:1000+ вызовов API с 1 cron-заданием?

Веб-приложение, которое может иметь 1000+ пользователей.

Мы хотим настроить cronjob для извлечения данных через API внешнего сервиса для ВСЕХ 1000 пользователей с одним вызовом cronjob (ПРИМЕЧАНИЕ: каждый пользователь имеет свои собственные учетные данные API с этим внешним API-сервисом)!

Что было бы разумным способом сделать это?

Информация:

  • Один API вызова с учетными данными может занять до 5 секунд, чтобы получить данные обратно (!).

Возможный сценарий:

Cronjob вызывает локальный скрипт PHP (cronjobcall.php), что петли через все 1000 пользователей. Для каждого пользователя этот скрипт вызывает другой локальный скрипт через curl (localfile_calls_api.php), который делает фактический вызов API и сохраняет возвращенные данные в базу данных MySQL.

cronjobcall.php

foreach($ThousandsOfUsers as $UserId => $UserCredentials) 
{ 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "localfile_calls_api.php?UserId=$UserId&UserCredentials=$UserCredentials"); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
$result=curl_exec($ch); 

} 

localfile_calls_api.php

// !!! this could take up to 5(!) seconds to return result 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://external_api_url.php?UserId=$UserId&UserCredentials=$UserCredentials"); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
$result=curl_exec($ch); 

if($result) 
{ 
save_to_MySql($result,$UserId); 
} 

Итак, вот почему я думаю, что расколоть всю процедуру в двух разных файлах PHP, так как API называют себя может занять до 5 секунд для возврата данных.

Это правильный подход?

Есть ли лучший способ сделать это?

Большое спасибо!

+0

5 секунд? Почему это имеет значение? Почему вы думаете о том, чтобы положить вызов API в отдельный файл PHP, сделало бы * любую * разницу? Вы просматриваете колоссальные 5000 секунд для всех пользователей, вряд ли стоит дважды подумать. Просто поместите все в один файл PHP, и он будет работать * не иначе *, чем помещать их в два файла; нет никакой причины думать, что два файла как-то лучше/быстрее. – meagar

+0

Зачем вам периодически обновляться данные? Если вам просто нужно это для пользователя, просто сделайте вызов api, когда пользователь входит в систему. – jeroen

+0

Я думал, что было бы лучше ... но что мне делать за 5000 секунд? Это ок. 83 минуты! Как сервер может это сделать? У большинства серверов есть настройка для остановки загрузки страницы через 30-40 секунд ...? Есть ли лучший способ сделать это, чем цикл? – user1033406

ответ

2

Если вам действительно нужно, чтобы сделать этот API вызов для каждого пользователя периодически, я бы поставил его по-разному:

  • Добавьте две колонки в таблицу: lastUpdated и isBeingProcessed (или нечто подобное);
  • Создайте скрипт, который запускает каждые X (1?) Минуты, используя cron;
  • В вашем скрипте получите записи XX (10?) Со старейшей датой lastUpdated и что они не обрабатываются и установлены флаг isBeingProcessed;
  • По завершении каждого вызова API обновите информацию о пользователе, включая дату или время, чтобы установить флаг isBeingProcessed;

В зависимости от того, что может обрабатывать ваш сервер и что позволяет API, вы можете даже настроить его для одновременного/параллельного выполнения нескольких заданий, что сокращает общее время для обновления.

+1

Спасибо за подсказку! Это может хорошо работать. – user1033406

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