2014-10-14 2 views
0

API를 사용하는 응용 프로그램에서 작업하고 있습니다. 나는 서버에 분당 2 건의 요청 만 할 수있다. 그래서 분당 2 번 데이터를 가져 오는 내 서버를 사용하고 있으며 내 응용 프로그램은 내 서버에서 데이터를 요청합니다.
필요한 데이터를 저장하는 서버가 데이터베이스에 있습니다. 따라서 사용자가 스마트 폰이나 태블릿에 표시 할 데이터가 필요한 경우 내 서버에서 데이터를 가져옵니다.PHP가 다른 서버에 요청이 실행되고 있는지 확인하십시오.

내 데이터베이스의 최신 항목이 30 초보다 오래된지 확인하는 PHP 스크립트가 있는데, 그렇다면 스크립트가 API 서버에서 현재 데이터를 가져 와서 내 데이터베이스에 저장합니다.

그러나 지금, 예를 들어. 1000 명의 사용자와 모든 사용자가 동시에 현재 데이터를 요청합니다. 스크립트는 수천 번 호출되며, 데이터베이스의 데이터가 30 초보다 오래되면 API 서버에서 데이터를 가져옵니다. 내 데이터베이스에서 현재 데이터를 사용할 수없는 한 API 서버? 분당 2 건의 요청을 초과 할까봐 걱정됩니다.

+0

가 _ "내 서버만큼 현재의 데이터가 내 데이터베이스에서 사용할 수 없습니다로 API 서버에 요청을 할 수 있는가?"_ - 모든 일의 특정 구현에 따라 달라 아니라 너 생각하지 않니? – CBroe

+1

어쩌면 현재 데이터의 경과 시간 정보를 저장하지 말고 해당 API에 대한 새 데이터 요청이 트리거 된 마지막 시간일까요? 다음 스크립트 인스턴스가 보일 경우 _ "OK입니다.이 데이터에 대한 마지막 요청은 불과 5 초 전에 트리거되었습니다."_ ... 그러면 지금 다른 요청을 트리거하지 마십시오. – CBroe

+0

내 스크립트는 서버에 한 번만 요청합니다. 응답을 받으면 데이터를 저장합니다. 하지만 내 서버에 1000 건의 요청이 있습니까? 내 서버가 API 서버에 1000 건의 요청을 처리하고 있습니까? 지금 구현하는 방법이 없습니다./ – beeef

답변

0

cron 작업을 사용하여 정확히 30 초마다 서버에서 데이터를 가져 와서 매 요청시 두 번 확인되는 부분을 잘라냅니다. 이미 크론 작업을하고 있다면 그건 무리입니다. 크론 당신이 파일 잠금을 사용하여 시도 할 수있는 옵션이없는 경우

Here's something.

편집

.

요청이있을 때 파일 시스템의 파일에 잠금을 설정하고 요청이 완료되면 잠금을 해제하는 것이 좋습니다. 요청이있을 때마다 파일이 잠겨 있는지 확인하십시오. 그렇다면 다른 사람이 현재 요청을 실행 중이므로 건너 뛸 수 있음을 의미합니다. 파일이 잠금 해제되어 있으면 현재 시간 소인을 저장하고 해당 시간 소인이 30 초보다 오래되었는지 확인할 수 있습니다.

// get current time by reading the file. You will need to create the file manually initially with the timestamp in it 
$last_run = file_get_contents('foo.txt'); 

// open the file 
$fp = fopen("foo.txt", "w"); 

// check if file is locked 
if (flock($fp, LOCK_EX | LOCK_NB)) { 

    // check that it's been more than 30 seconds 
    if($last_run > (time() - 30)){ 

     // if file is unlocked update it with current timestamp 
     $fwrite($fp, time()); 

     // make request to server, upload to db 

     // after request has been made, unlock the file 
     flock($fp, LOCK_UN); 

    } 

} else { 

    // someone else is triggering the request, get data from db 

} 

Here's something else..

+0

cron은 1 분 간격으로 만 실행할 수 있으므로이 방법을 사용하려면 스크립트에서 타이머를 작성하여 첫 번째 요청 이후 30 초가 지나면 두 번째 요청을 실행해야합니다. –

+0

서버에서 Parallels Plesk Panel (v11.5.30)을 실행하고 있지만 cron 작업을 생성 할 수있는 권한이 없다고 생각합니다. 따라서 cron 작업은 필자의 경우 최적의 솔루션이 아닙니다. – beeef

+0

@MikeBrant 또는 매 2 분마다 동일한 스크립트를 실행하는 2 개의 cron 작업이 있습니다. 서로 30 초 간격으로 오프셋됩니다. –

관련 문제