개발! 딱 깔끔하고 센스있게!

PHP 에서 코드 블록 초과 검사 본문

개발 스크랩 메모/PHP

PHP 에서 코드 블록 초과 검사

렉사이 2020. 12. 23. 23:54

만약 한 코드블록이 PHP 에 너무 오래 걸리면 중지할 방법이 없을까요?그런 것 같습니다:

//Set the max time to 2 seconds $time = new TimeOut(2); $time->startTime(); sleep(3) $time->endTime(); if ($time->timeExpired()){ echo 'This function took too long to execute and was aborted.'; } 

그것은 완전히 위와 같을 필요는 없지만 로컬 PHP 함수나 종류가 이런 일을 할 수 있을까?

편집: Ben Lee 는 pcntu fork 로 주어진 답안은 완벽한 해결 방안일 뿐, 윈도 (Windows) 에 적용되지 않습니다.

PHP 로 이를 이룰 수 있는 방법이 없습니다.

PHP는 윈도우와 리눅스에 적용되지만 외부 라이브러리는 필요 없습니다.

편집 2:Xzkto의 해결 방안은 어떤 상황에서 유효하지만 일치하지 않고 이상을 잡을 수 없는 것 같습니다.

내가 무엇을 시도하든.용례 가 단원 테스트 의 초과 시간 을 검사하고 있다만약 시험이 초과되면, 나는 그것을 멈추고 다음 테스트로 넘어가고 싶다.

대답

포크 프로세스를 통해 부모 프로세스 프로세스를 사용하여 이 작업을 완성할 수 있습니다.

pcntlu fork 은 파생 프로세스 방법으로 메모리 중 거의 같은 프로그램을 병행합니다.

한 프로세스 프로세스 pcntlu fork 이 정정수를 되돌리기 위해서, 그 프로세스의 id 에 대응합니다.

다른 과정에서 서브프로세스 pcntlu fork 이 0으로 돌아간다.

다음은 예입니다:

$pid = pcntl_fork(); if ($pid == 0) { // this is the child process } else { // this is the parent process, and we know the child process id is in $pid } 

기본 구조입니다.

다음 단계는 프로세스 시간을 추가합니다.

당신의 물건은 소자 프로세스에서 실행됩니다.

아버지 프로세스는 감시와 시간의 프로세스를 담당할 것입니다.

그러나 한 프로세스 (아버지 프로세스) 를 다른 프로세스를 죽이기 위해 신호가 필요하다.

신호는 프로세스 통신의 방식이었지만 "바로 끝내야 한다"는 신호는 SIGKILL 이다.

posixu kill 으로 이 신호를 보낼 수 있습니다.

그래서 부모님은 2초 후에 아이를 죽였어야 합니다.

이렇게.

$pid = pcntl_fork(); if ($pid == 0) { // this is the child process // run your potentially time-consuming method } else { // this is the parent process, and we know the child process id is in $pid sleep(2); // wait 2 seconds posix_kill($pid, SIGKILL); // then kill the child } 
Comments