2012-06-08 3 views
0

적어도 4 명의 사용자를 동시에 처리하기 위해 병렬 프로세스를 실행하고 싶습니다. 현재 일어나고있는 무엇PHP PCNTL - 터미널에서 제어 유지하기

> php testscript.php 
parent1 
parent1 
parent1 
parent1 
> parent2 
parent2 
parent2 
parent2 

분실, 새로운 빈 명령 줄이 시작 스크립트에 parent1 4 배 컨트롤을 표시 한 후입니다 :

ob_end_flush(); 

for($i = 0; $i < 4; $i++) 
{ 
    $pid=pcntl_fork(); 
    if ($pid == -1) { 
     echo("Could not create a new child."); 
     exit; 
    } else if ($pid == 0) { 
     //This will get excuted only in the child process 
     echo 'parent1'; 
     sleep(5); 
     echo 'parent2'; 
    exit; 
    } 
} 

출력은 다음과 같은 것입니다. 5 초를 더 기다린 후 나머지 출력이 나옵니다.

어떻게 그런 일이 발생하지 않도록 할 수 있습니까? 나는 원할 때 스크립트를 깨고 싶다.

EDIT

은 중지, 즉 순간에 중지 스크립트를 통보 할 수있는 방법을 필요로하지 난 CTRL + C를 눌러 단자를 통해 말 신호를 보낼 경우, 스크립트는 않는다.

+0

방법 "원하는"당신의 뇌파는 뇌가 있습니다 내 블로그에 앉아 예를 들어 포크 래퍼가 전송을 PHP 스크립트에? 나는 도서관이 뇌파를 위해 존재한다는 것을 몰랐습니다. 당신은 정교 할 수 있는가, 모두가 알아야 할 아주 멋진 확장처럼 보인다. – hakre

+0

이 질문을 수정했습니다. 요구 사항은 PHP 스크립트가 터미널 포스트에서 보낸 신호를 수신 대기하도록하는 것입니다. – Rishabh

+0

[Ctrl-z, ctrl-c를 PHP 스크립트를 중단하지 못하도록하는 방법] (http://stackoverflow.com/questions/2774331/how-to-disable-ctrl-z-ctrl-c-from) -breaking-out-of-a-php-script)? – hakre

답변

1

당신은 당신이 만드는 이해할 필요가

당신이 분기와 협력하고 분명 그들도 원하지 않는 다른 사람에 의해 채택되고있어 더러운 좀비/부모가없는 프로세스를 =) 작성 현재 프로세스 (스택/힙 및 모두)의 복사본을 생성하고 새로운 프로세스 ID (PID)를 부여하고 생성 된 프로세스가 자식이라고 말할 때 자신의 부모 ID (PPID)를 설정합니다. 여기에 4 명의 신생아의 부모가 그의 모든 명백한 일을 끝내고 아무런 실수도없이 죽었습니다. 왜냐하면 그는 할 일이 없기 때문입니다. 그러나 존중하는 부모는해야 할 일처럼 부모의 과정은 주변에 앉아서 자녀를 돌봐야합니다. 신호가 특히 SIGCHLD 신호로 유용 할 수있는 곳입니다.이 시그널은 아이가 지나간 부모 프로세스에게 보내질 것입니다. 작은 이벤트와 루프를 처리하고 부모가 적절하게 자신의 아이들을 관리 할 수있는 결합 \ O/

TL; DR 나는 http://codehackit.blogspot.be/2012/01/childpids-break-pcntlsignaldispatch.html

+0

블로그에서 코드를 사용하면 각 프로세스가 이전 프로세스가 먼저 완료 될 때까지 기다리고 있습니다. 내 요구 사항은 이전의 자녀와 관계없이 이러한 프로세스를 실행하는 것입니다. – Rishabh

+0

그건 사실이 아닙니다. 어떻게 사용하고 있는지, 클라이언트 오류가 있는지 예를 게시하십시오. – smassey

+0

예, 실제로 구현시 실수였습니다. 대단히 감사합니다. 감사합니다. – Rishabh

0

pcntl_signal을 사용하여 사용자 정의 방식으로 반응 시키려면 CTRL-C (SIGINT과 같음, 값 2)에 대한 신호 처리기를 설정해야합니다.

+0

시도했지만, 헛된. parent1이 네 번째로 표시되면 새 터미널 행이 시작되므로 PHP 스크립트에 신호를 보내지 않으면 CTRL-C를 누릅니다. – Rishabh