2014-02-09 1 views
0

다음과 같은 잠재적 상황이 발생할 수 있습니다.1 + cron 작업으로 1000+ API 호출?

1000 명이 넘을 수있는 웹 앱.

우리는 cronjob 호출이있는 1000 명 이상의 모든 사용자에 대해 외부 서비스 API를 통해 데이터를 가져 오도록 설정하려고합니다 (참고 : 각 사용자는 외부 API 서비스와 함께 자신의 API 자격 증명을가집니다)!

현명한 방법은 무엇입니까?

정보 : (!) 자격 증명

  • 하나의 API 호출이 다시 데이터를 얻을 5 초까지 걸릴 수 있습니다.

가능한 스크립트를

cronjob에 모두 1000 명의 사용자를 순환 로컬 PHP 스크립트 (cronjobcall.php)를 호출합니다. 각 사용자에 대해이 스크립트는 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를 호출해야 할 경우

+0

5 초? 그게 왜 중요한거야? API 호출을 별도의 PHP 파일에 넣는 것이 왜 * 어떤 차이를 만들 것이라고 생각하십니까? 모든 사용자에게 무려 5000 초가 걸릴 것으로 예상됩니다. 두 번 생각해 볼 가치가 없습니다. 모든 것을 하나의 PHP 파일에 넣으면 두 파일에 넣는 것보다 * 다를 바 없습니다. 두 파일을 어떻게 든 더 좋게/빨리 생각할 이유가 전혀 없습니다. – meagar

+0

왜 주기적으로 데이터를 새로 고쳐야합니까? 사용자를 위해 필요한 경우 그냥 사용자가 로그인 할 때 API 호출을 만드십시오. – jeroen

+0

나는 더 좋았을 것이라고 생각했지만 ... 5000 초로 무엇을해야합니까? 그게 ca 야. 83 분! 서버가 어떻게 이것을 할 수 있습니까? 대부분의 서버는 30 ~ 40 초 후에 페이지로드를 중지하도록 설정되어 있습니다 ...? 이렇게 반복하는 것보다 더 좋은 방법이 있을까요? – user1033406

답변

2

, 나는 그것을 다르게 설정하는 것입니다 :

  • 이 테이블에 두 개의 열을 추가 lastUpdatedisBeingProcessed (또는 뭔가 유사한);
  • cron을 사용하여 매 X (1 분)마다 실행되는 스크립트를 만듭니다.
  • 스크립트에서 가장 오래된 lastUpdated 날짜와 처리되지 않는 XX (10?) 레코드를 가져오고 isBeingProcessed 플래그를 설정하십시오.
  • 각 API 호출이 완료되면 lastUpdated 날짜 또는 시간을 포함하여 사용자 정보를 업데이트합니다. isBeingProcessed 플래그를 설정 해제하십시오.

서버가 처리 할 수있는 것과 API가 허용하는 것에 따라 여러 작업이 동시에 실행되거나 겹쳐 지도록 설정할 수 있으므로 많은 업데이트 시간을 줄일 수 있습니다.

+1

팁 주셔서 감사합니다! 그것은 여기서 잘 작동 할 수 있습니다. – user1033406

관련 문제