2014-10-22 4 views
2

다음 PHP 스크립트가 있습니다. 5 가지 다른 자식 프로세스 (pcntl_fork() 함수 사용)를 사용하여 5 가지 다른 작업을 수행해야합니다. 차일 즈는 올바르게 만들어지며 물건을 만들지 만 절대 나가지 않은 것처럼 보입니다. 부모는 끝내기를 기다리지 만 결코 일어나지 않습니다. 아무도 내가 뭘 잘못하고 있는지 말해 줄 수 있니?PHP - 하위 프로세스가 제대로 종료되지 않습니다.

<?php 
for ($i=1; $i<=5; $i++) { 
    $pid = pcntl_fork(); 

    if ($pid == -1) { 
     die("Error Creating subprocess ".$i); 
     exit(-1); 
    } 
    else if (!$pid) { 

     switch ($i) { 
      case 1: 
       // Child 1 
       error_log("I\'m the child number ".$i." PID: ".getmypid()."\n", 3, "/var/log/php_errors.log"); 
       //Doing some stuff 
       exit; 
      case 2: 
       // Child 2 
       error_log("I\'m the child number ".$i." PID: ".getmypid()."\n", 3, "/var/log/php_errors.log"); 
       //Doing some stuff 
       exit; 
      case 3: 
       // Child 3 
       error_log("I\'m the child number ".$i." PID: ".getmypid()."\n", 3, "/var/log/php_errors.log"); 
       //Doing some stuff 
       exit; 
      case 4: 
       // Child 4 
       error_log("I\'m the child number ".$i." PID: ".getmypid()."\n", 3, "/var/log/php_errors.log"); 
       //Doing some stuff 
       exit; 
      case 5: 
       // Child 5 
       error_log("I\'m the child number ".$i." PID: ".getmypid()."\n", 3, "/var/log/php_errors.log"); 
       //Doing some stuff 
       exit; 
      default: 
       break; 
     } 
    } 
    else { 
     $pids[] = $pid; 
    } 
} 

error_log("Luke, I\'m your father. PID: ".getmypid()."\n", 3, "/var/log/php_errors.log"); 
foreach ($pids as $key => $child) { 
    $res = pcntl_waitpid($child, $status); 
    //Check if this child has exited normally 
    if (pcntl_wifexited($status)) 
     error_log("Child ".$child." has ended\n", 3, "/var/log/php_errors.log"); 
    else 
     error_log("Child ".$child." is zombie\n", 3, "/var/log/php_errors.log"); 

    if($res == -1 || $res > 0) 
     unset($pids[$key]); 
} 
?> 
+0

스위치에는 항상 기본 사례가 있어야합니다. (이것은 단지 참고 사항입니다) –

+0

고마워요! 방금 게시물을 편집했습니다. – serenhopy

+0

왜 종료합니까? –

답변

0
<?php 
for ($i=1; $i<=5; $i++) { 
    $pid = pcntl_fork(); 

    if ($pid == -1) { 
     die("Error Creating subprocess ".$i); 
     exit(-1); 
    } 
    else if (!$pid) { 

     switch ($i) { 
      case 1: 
       // Child 1 
       error_log("I\'m the child number ".$i." PID: ".getmypid()."\n", 3, "/var/log/php_errors.log"); 
       //Doing some stuff 
       exit; 
      case 2: 
       // Child 2 
       error_log("I\'m the child number ".$i." PID: ".getmypid()."\n", 3, "/var/log/php_errors.log"); 
       //Doing some stuff 
       exit; 
      case 3: 
       // Child 3 
       error_log("I\'m the child number ".$i." PID: ".getmypid()."\n", 3, "/var/log/php_errors.log"); 
       //Doing some stuff 
       exit; 
      case 4: 
       // Child 4 
       error_log("I\'m the child number ".$i." PID: ".getmypid()."\n", 3, "/var/log/php_errors.log"); 
       //Doing some stuff 
       exit; 
      case 5: 
       // Child 5 
       error_log("I\'m the child number ".$i." PID: ".getmypid()."\n", 3, "/var/log/php_errors.log"); 
       //Doing some stuff 
       exit; 
      default: 
       break; 
     } 
    } 
    else { 
     $pids[$pid] = $pid; 
    } 
} 

while (!empty($pids)) { 
    if ($child = pcntl_wait($status, WNOHANG)) { 
    if (pcntl_wifexited($status)) 
     error_log("Child ".$child." has ended\n", 3, "/var/log/php_errors.log"); 
    else 
     error_log("Child ".$child." is zombie\n", 3, "/var/log/php_errors.log"); 
    unset($pids[$child]);  
    } else 
    usleep(100); 
} 

망가 $을 변경하는 것을 잊지 PID를 [] = $ PID; ~ $ pids [$ pid] = $ pid; : o) 배열 이탈 한 아이에게서 튀는 더 좋은 방법을 선택하십시오.

+0

감사 답변을 위해, 나는 이러한 변화를 한 것으로 편집했지만 여전히이 내 php_errors.log 파일에 무엇을 얻을 :(작동하지 않습니다.., 내가 네 아버지 야 '누가 복음 PID : 8986' '루크, 난 네 아버지 야 PID : 8986' '나는 자식이다. 1 PID : 9980' '루크, 너의 아버지 야 PID : 8986' '나는 아이 야. 번호 2 PID : 9981' 루크, 나 너의 아빠 야 PID : 8986' '나는 자식이다 3 번 PID : 9982' 루크, 나 너의 아빠 야 PID : 8986' 'I '자식 수를 해요 4 PID : 9983의' '루크, 난 네 아버지 PID : 8986의' '내가 아이 번호 5 PID를 해요 :. 출구를 사용하는 9984' – serenhopy

+0

시도 (0) 대신 출구; –

+0

나는 이미 그것을 시도했다. 하지만 결과는 동일합니다. exit, exit, $ exit와 exit를 시도했습니다. – serenhopy

관련 문제