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에 따르면, 이것은 내부 데이터에서만 작동하며 사용자가 아무것도 수정할 수 없습니다.
수면이없는 경우 왜 서버 검사 중 일부가 실패합니까? 어떤 낙관론이나 더 좋은 방법을 추천 할 수 있습니까? 배경 처리 문제에 대답 아니지만
유일한 것은 전경이 db 쿼리와 루프를 포함하는 백그라운드 프로세스를 시작하는 단일 호출이어야한다는 것입니다. –
아마도 (공유되는) 서버에 리소스 (메모리, 프로세스 수 등)가 부족합니다. 동시에 30 개 이상의 스크립트를 모두 실행하려고하면 대신 대기열 및 스케줄러 (Linux의 cron)와 같은 것을 사용합니다 (예 : 여기 참조). http://stackoverflow.com/questions/21661370/1000-api-calls-with-1-cron-job/21661938# 21661938 – jeroen
@Dagon 죄송합니다. 말씀하신 내용을 이해하지 못했습니다. – user2693017