мы имеем следующую потенциальную ситуацию:
Веб-приложение, которое может иметь 1000+ пользователей.
Мы хотим настроить cronjob для извлечения данных через API внешнего сервиса для ВСЕХ 1000 пользователей с одним вызовом cronjob (ПРИМЕЧАНИЕ: каждый пользователь имеет свои собственные учетные данные API с этой внешней службой API)!
Что было бы разумным способом сделать это?
Информация:
Возможный сценарий:
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 секунд для возврата данных.
Правильно ли это?
Есть ли лучший способ сделать это?
Большое спасибо!
Если вам действительно нужно периодически вызывать этот вызов API для каждого пользователя, я бы установил его по-другому:
lastUpdated
и isBeingProcessed
(или что-то подобное); lastUpdated
датой и не обрабатываемыми и установите флаг isBeingProcessed
; lastUpdated
дату или время, isBeingProcessed
флаг isBeingProcessed
; В зависимости от того, что может обрабатывать ваш сервер и что позволяет API, вы можете даже настроить его на одновременное / одновременное выполнение нескольких заданий, что сокращает общее время для обновления.