2013-07-16 3 views
0

새 스레드에서 CLI 클래스의 일부 메서드를 실행하려면 PHPpcntl extetntion을 사용하려고합니다. 작은 테스트 방법을 썼습니다 :새로운 PHP 프로젝트를 시작하고 종료하는 방법은 무엇입니까?

private function startProcess($data) 
{ 
    $this->log('Start a child process'); 

    $pid = pcntl_fork(); 

    if($pid == -1) 
     $this->log('Could not fork'); 
    elseif($pid) 
     pcntl_wait($status); 
    else { 
     $this->process($data); 
     sleep(10); 
     posix_kill(posix_setsid(), SIGTERM); 
    } 
} 

이 메서드는 10 번 호출됩니다. $this->process($data);은 콘솔에 데이터를 인쇄합니다. 내가 알기로는 프로세스가 종료 된 후에 10 개의 프로세스를 시작하고 데이터를 인쇄해야합니다. 하지만 대신 각 메시지마다 10 초를 기다려야합니다. 내가 틀린 곳?

+0

'pcntl_wait'는 자식 프로세스가 상태를 반환 할 때까지 기다립니다. 당신의 아이는 10 초를 기다립니다. 부모는 자식이 퇴장 할 때까지 아무 것도하지 않을 것입니다 (posix_kill로하는 것). 성취하고자하는 것은 무엇입니까? –

답변

2

각 프로세스가 시작된 후 즉시 완료 될 때까지 기다리는 중입니다. 한 번에 10을 돌리고 싶다면 모두 10을 시작할 때까지 기다리지 마십시오.

for($i = 0; $i < 10; $i++) 
    startProcess(...); 

for($i = 0; $i < 10; $i++) 
    pcntl_wait($status); 

private function startProcess($data) 
{ 
    $this->log('Start a child process'); 

    $pid = pcntl_fork(); 

    if($pid == -1) 
     $this->log('Could not fork'); 
    elseif(!$pid) { 
     $this->process($data); 
     sleep(10); 
     posix_kill(posix_setsid(), SIGTERM); 
    } 
} 
+0

어떻게하는가 ??? – Kin

+0

@Kirix - 무언가를 이해하지 못한다면, 이해하지 못하는 것을 말하고, 타이핑을하십시오. 너 바보 같아. 이 답변이 유일한 유일한 방법입니다. 그는 10 개의 프로세스를 먼저 실행 한 다음 다른 블록에서 종료 상태를 기다립니다. 당신은 그렇게하지 않았습니다. 각 기능이하는 일에 대한 설명이 필요하다면 정상적인 지능형 인간과 같이 말하십시오. –

+0

@ N.B. 당신의 대답을 편집하기 전이었습니다. 그래서 시도했지만 좀비 프로세스가됩니다. https://www.dropbox.com/s/wc6owbk8qf19kyy/php_zombie.jpg – Kin

관련 문제