2012-02-03 2 views
2

저는 온라인 판사가 PHP를 작성하려고합니다.`exec()`에 대한 호출에 시간 제한을 적용하려면 어떻게해야합니까?

exec("gcc /var/www/qwerty.c -o /var/www/binary",$output,$returnval); 
print_r($output); 
exec("cat /var/www/qwe.txt | /var/www/binary",$output,$returnval); 
print_r($output); 

그러나, 내가 실행하는 데 최대 1 초 가지고 exec에 의해 산란 각 프로세스를 원하는 : 내 코드는 현재처럼 보인다. 어떻게해야할지 모르겠습니다. 하고 set_time_limit()는 당신은 아마 그것을 위해 ulimit을 사용할 수 있습니다

+2

무엇 세계? – MetalFrog

+0

증인, 만약 당신이 원한다면, 제 질문의 제목을 개선하십시오. –

+0

@ManseUK : 바로 그 페이지를 읽어라 :'set_time_limit() 함수와 설정 지시자 max_execution_time은 스크립트 자체의 실행 시간에만 영향을 미친다. 스크립트가 실행 된 최대 시간을 결정할 때 system()을 사용하는 시스템 호출, 스트림 작업, 데이터베이스 쿼리 등과 같은 스크립트 실행 이외의 상황에서 발생하는 활동에 소요되는 시간은 포함되지 않습니다. 측정 된 시간이 실제 인 Windows에서는 그렇지 않습니다. ' –

답변

4

작동하지 않습니다 : 프로세스가 끝없이 I/O를 대기하지 않을 경우, 활성 CPU 시간을 사용하는 경우 물론에만 작동

exec(" (ulimit -t 1 ; gcc ... | /var/www/binary) "); 

있다.

3

이 기능은 proc_ 패밀리를 사용하여 수행 할 수 있습니다. proc_open을 사용하여 프로세스를 시작하십시오. 프로세스가 반환되거나 1 초가 경과 할 때까지 proc_status을 사용하여 반복적으로 폴링합니다. 프로세스가 완료되었음을 나타내는 proc_status없이 1 초가 지나면 proc_terminate (또는 proc_close)을 사용하여 제거하고 적절한 조치를 취하십시오.

PHP 스크립트에서 외부 프로세스를 생성하는 것이 좋습니다.

6

@ 아담 라이트에 의해 제안 나는 proc_ 기능을 사용하지만, 리눅스와 같은 환경에 대한 빠른 대안은 명령 전에 GNU timeout 명령을 사용하는 것입니다 :

// If it took more than 1 second, $returnval will got the exit code 124 
exec('timeout 1 gcc /var/www/qwerty.c -o /var/www/binary', $output, $returnval); 
관련 문제