2013-05-16 3 views
2

실행중인 스크립트의 현재 실행 타이밍을 감지 할 수 있는지 궁금한데 네트워크상의 일부 컴퓨터에 대해 ping을 수행하는 응용 프로그램을 만들고 있습니다. Linux 시스템에서 수행 중이므로 ping 시스템은 Windows와 다릅니다. 컴퓨터가 다음 서버가 ping 명령을 실행 한 후 기본 메시지를 끊고하지 더 이상 출력이 .. 단지실행 시간이 오래 걸리면 실행 시간을 캡처하고 다음 요소로 이동

(리눅스 핑 내 경험을) 중단됩니다 것 꺼져 있으면 리눅스 시스템에서

,

그래서 나는이 스크립트가 :

$Computer_Array = array( 
    "Managers" => "192.168.0.5", 
    "Domain Controller" => "192.168.0.1" 
    "Proxy Controller" => "192.168.0.214" 
); 
foreach ($Computer_Array AS $Addresses){ 
    exec('ping'.$Addresses, $Output); 
} 

나중에이에 대한 통계를 표시하는 데 사용됩니다 .. 이제 문제는 관리자 컴퓨터는 때 오프에 또는 등의 전원 상태에 모두 적용됩니다로 ping 명령을 내리면 그냥 멈 춥니 다. 내가 임계 값을 초과하면 다음 요소로 이동하면 현재 실행 함수의 microtime();을 캡처하는 방법이 있는지 궁금하네요. 차라리 핵심 PHP를 사용하고 싶지만, AJAX 나 다른 언어를 통해서만 해결할 수 있다면, 외부 메소드를 통합해도 괜찮 으면 개발자에게 문의해야 할 것입니다. 당신이 유사한 문제로 PHP와 함께이 작업을 수행하거나 실행하려면

+0

이것은 백그라운드에서 프로세스를 실행하는 것이 가장 좋은 방법이며, 'microtime'을 사용하여 얼마나 오래되었는지 확인하고 시간이 초과되면 다음 클라이언트로 계속 진행할 수 있습니다. http://stackoverflow.com/questions/45953/php-execute-a-background-process#45966 –

+1

ping ([-T timestamp option]) 명령 줄에서 시간 초과를 설정하지 않는 이유는 무엇입니까? –

답변

1

ping 명령은 당신이 포기하기 전에 대기하는 시간을 지정할 수 있습니다 :

ping -c 5 -t 1 127.0.0.2 

이 관계없이 보냈습니다 얼마나 많은 핑의 1 초 후에 반환합니다. 정확한 명령 행 인수는 플랫폼마다 다를 수 있습니다.

pcntl을 사용할 수있는 경우 pcntl_alarm()을 조사하십시오. 걸릴 수있는 특정 시간 후에 응용 프로그램에 SIGALRM 신호를 전달합니다.

마지막으로이 테스트를 직접 거치지 않았으므로 proc_open()을 사용하고 파이프 중 하나에 stream_select()을 사용할 수 있습니다. 일정 시간이 지나도 파이프에 아무 것도 발생하지 않으면 프로세스를 종료 할 수 있습니다.

0

, 여기에 출력 파일에 쓰기 권한이 필요 php execute a background process

PHP 스크립트에서 코드를 사용하는 예입니다. 이 개념은 핑 (ping)에서부터 다른 PHP 스크립트에 이르기까지 본질적으로 효과가 있습니다.

function isRunning($pid){ 
    try{ 
     $result = shell_exec(sprintf("ps %d", $pid)); 
     if(count(preg_split("/\n/", $result)) > 2){ 
      return true; 
     } 
    }catch(Exception $e){} 

    return false; 
} 

$cmd = "ping 127.0.0.1"; 
$outputfile = "output"; 
$pidfile = "pid"; 

$start = microtime(true); 

// Don't last longer than 10 seconds 
$threshold = 2; 

// Ping and get pid 
exec(sprintf("%s > %s 2>&1 & echo $! > %s", $cmd, $outputfile, $pidfile)); 
$pid = `tail -n 1 $pidfile`; 

// Let the process run until you want to stop it 
while (isRunning($pid)){ 

    // Check output here... 

    if ((microtime(true)-$start) > $threshold){ 
     $o = `kill $pid`; 
     die("Timed out."); 
    } 
} 


$end = microtime(true); 
$time = $end - $start; 

echo "Finished in $time seconds\n"; 
관련 문제