2014-09-14 5 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 fork (как fork in NIX) это только полная копия процесса и ее env. Родительский процесс неизвестен об изменениях в детях. И дети не могут передать результаты родителям. Родитель может проверять только процесс завершения работы с детьми. Если вы хотите передавать данные, вы можете использовать общую память. Но внимание! Общая память в php - это не настоящая (OS) общая память. Но для php это работает.

Вы можете найти решение здесь: https://github.com/search?q=php+fork

Смежные вопросы