2014-02-18 5 views
1

5 분마다 서버에 ping을 수행해야하는데 전반적으로 30 초 이상 걸립니다. 그래서 나는 백그라운드에서 이것을하기 위해 exec 명령을 사용했다고 생각했다.PHP가 백그라운드에서 실행됩니다. 지연없이 정상적으로 작동하지 않습니다.

function execInBackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
     pclose(popen("start /B ". $cmd, "r")); 
    } 
    else { 
     exec($cmd . " > /dev/null &"); 
    } 
} 

$result = mysql_query("SELECT `id` FROM `servers` ORDER BY `id`"); 

while ($server_data = mysql_fetch_array($result, MYSQL_ASSOC)) { 

    sleep(1); 
    execInBackground("php server_updater.php " . $server_data['id']); 

} 

나는 잠깐 잠을 잤다. 30 대 이상의 서버를 확인해야하므로 필요하지 않으며 작동하지 않습니다. 1 초의 절전 모드를 설정하지 않으면 온라인 상태 인 몇 대의 서버에서 업데이트 스크립트가 실패합니다.

업데이트 스크립트는 위에서 스크립트에서 업데이트해야하는 서버의 ID를 가져오고 쿼리를 사용하여 서버 상태를 확인합니다. 성공하면 실패한 데이터베이스의 데이터를 데이터베이스에 입력하고 데이터베이스의 서버 항목을 오프라인으로 갱신합니다.

mysql_query에 따르면, 이것은 내부 데이터에서만 작동하며 사용자가 아무것도 수정할 수 없습니다.

수면이없는 경우 왜 서버 검사 중 일부가 실패합니까? 어떤 낙관론이나 더 좋은 방법을 추천 할 수 있습니까? 배경 처리 문제에 대답 아니지만

+0

유일한 것은 전경이 db 쿼리와 루프를 포함하는 백그라운드 프로세스를 시작하는 단일 호출이어야한다는 것입니다. –

+1

아마도 (공유되는) 서버에 리소스 (메모리, 프로세스 수 등)가 부족합니다. 동시에 30 개 이상의 스크립트를 모두 실행하려고하면 대신 대기열 및 스케줄러 (Linux의 cron)와 같은 것을 사용합니다 (예 : 여기 참조). http://stackoverflow.com/questions/21661370/1000-api-calls-with-1-cron-job/21661938# 21661938 – jeroen

+0

@Dagon 죄송합니다. 말씀하신 내용을 이해하지 못했습니다. – user2693017

답변

1

아마도 서버가 동시에 모든 30 + 스크립트를 실행하려고 자원 (메모리, 프로세스의 번호 등)에서 실행됩니다.

대신 대기열과 스케줄러 (Linux의 경우 cron)를 사용합니다 (예 : this answer 참조). 요약하면 업데이트 할 레코드 묶음을 "체크 아웃"하여 순차적으로 처리합니다.

당신이 처분 할 수있는 자원에 달려 있지만, 동시에 여러 큐를 처리 할 수 ​​있습니다 (비동기 exec() 호출이 필요 없음).

또한 스크립트의 여러 버전에서 레코드가 "체크 아웃"되지 않도록 테이블 잠금을 조사해야합니다.

0

,이 대답은 어쨌든 도움이 될 수 있습니다

를 들어 저장 시계열 데이터, 훌륭한 솔루션 IST RRDtool. 그것은 시간이 지남에 많은 양의 데이터를 저장하고 그와 같은으로 차트이 데이터를 변환 :

enter image description here

은 또한, 나는 전문 모니터링 솔루션를 사용하는 제안 것입니다. 시스템 상태를 시각적으로 잘 표현할 수있는 솔루션은 CACTI입니다. CACTI website에서 (? 공유)

enter image description here

+0

고마워,하지만 정확히 내가 원하는 건 그게 아니야. 나는 이미 이것을 위해 monitorix를 사용한다;) – user2693017

관련 문제