2011-05-10 2 views
1

PHP에서 shell_exec의 최대 실행 시간을 20 초로 제한하고이 시간 동안 생성되는 출력을 가져 오려고합니다. shell_exec가 20 초 이내에 끝나면 스크립트는 직접 진행해야합니다.shell_exec의 실행 시간을 제한하고 어떤 출력이 생성 되든지 잡아

더 구체적으로는 많은 수의 Subversion 저장소 리비전을 반복하는 함수를 개발 중입니다. 각 리비전마다 svn diff를 가져 와서 추가 된 행 수를 계산합니다. 문제는 매우 큰 파일이 개정에서 커밋 된 경우 스크립트가 중단된다는 것입니다. 따라서 각 svn diff 명령의 실행 시간을 제한하려고합니다.

sleep()과 함께 사용하는 popen()은 100 회 반복으로 실행되지 않을 때마다 20 초 동안 스크립트를 잠자기 상태로 만드는 것으로 보이는 옵션이 아닙니다. max_execution_time 설정은 치명적인 오류를 반환하기 때문에 옵션이 아닙니다.

답변

2

popen() 또는 proc_open은 여전히 ​​옵션이지만 sleep()을 피하고 실행 시간을 직접 관리해야합니다.

$end = time() + 20; 
while (!feof($stream) && (time() < $end)) { 

    $output .= fread($stream); 

는 popen 스트림은 여전히 ​​비 차단을 설정해야합니다 : 어쨌든 작은 time_nanosleep()을 추가하는 것을 고려한다, 그래서

stream_set_blocking($stream, 0); 

폴링이 같은 출력은 여전히 ​​약간의 응력 변형 될 수 있습니다. 어느 경우이든 런타임은 time()<$end 검사로 최대 20 초로 제한됩니다.

관련 문제