2014-09-14 8 views
1

여러 프로세스에서 for 루프를 실행하려고하는데 각 for 루프가 부모 프로세스의 배열에 쓸 필요가 있습니다. 배열을 사용하여 하위 프로세스를 종료하려고 시도했지만 pcntl_wexitstatus()은 정수만 반환 할 수 있습니다. 그래서 나는 붙어있다.자식 프로세스가 부모 프로세스에 값을 반환하는 방법

저는 멀티 프로세싱에 매우 익숙합니다. 그러나 부모와 자식간에 변수를 공유하는 좋은 해결책은 shmop이지만 실제로 활용하는 방법을 모르겠다는 것을 알게되었습니다.

$output = array(); 

for ($i = 0; $i < 4; $i++) { 
    $pid = pcntl_fork(); 
    $start = ($i == 0) ? 1 : (1000000 * $i) + 1; 
    $end = 1000000 * ($i + 1); 

    if (!$pid) { 
     for ($run = $start; $run <= $end; $run++) { 
      $output[$i][] = 'Run ' . $run; 
     } 

     exit($i); 
    } 
} 

while (pcntl_waitpid(0, $status) != -1) { 
    $status = pcntl_wexitstatus($status); 
} 

echo implode("\n", $output); 

그냥 내가는 $output 배열도 백만 항목을 각각 배열 네 개의 항목을 포함해야 일이 기대하는 것을 명확히하기 :

여기 내 코드입니다. 그것은 다음과 같아야합니다 :

Array 
(
    [0] => Array 
     (
      [0] => Run 1 
      [1] => Run 2 
      [2] => Run 3 
      ... 
     ) 

    [1] => Array 
     (
      [0] => Run 1000001 
      [1] => Run 1000002 
      [2] => Run 1000003 
      ... 
     ) 

    [2] => Array 
     (
      [0] => Run 2000001 
      [1] => Run 2000002 
      [2] => Run 2000003 
      ... 
     ) 

    [3] => Array 
     (
      [0] => Run 3000001 
      [1] => Run 3000002 
      [2] => Run 3000003 
      ... 
     ) 

) 
+0

당신이 뭘하려고 어떻게 당신이 그것을 달성하기 위해 노력하고있는 무슨에 초점을 맞출 것입니다. 개인적으로는 실행 단위간에 데이터를 공유해야하므로 프로세스가 아닌 스레드가 필요합니다. 프로세스간에 데이터를 "공유"하는 또 다른 형태는 각 프로세스가 종료되기 전에 작성하는 중앙 데이터베이스입니다. 부모가 포착 한 신호는 그러한 데이터베이스에서 읽게됩니다. 가장 빠른 솔루션은 아니지만 작동합니다. 그러나 http://www.php.net/pthreads를 살펴보십시오. –

답변

0

Php 포크 (NIX의 포크와 같이) 이것은 프로세스와 그녀의 env의 전체 사본입니다. 부모 과정은 아이들의 변화를 알지 못합니다. 그리고 아이들은 결과를 부모에게 전달할 수 없습니다. 부모는 자식 프로세스의 끝만 검사 할 수 있습니다. 데이터를 전달하려면 공유 메모리를 사용할 수 있습니다. 그러나주의! PHP에서 공유 메모리 이것은 실제 (OS) 공유 메모리가 아닙니다. 하지만 PHP 작동합니다.

당신은 여기에 대한 해결책을 찾을 수

: https://github.com/search?q=php+fork

관련 문제