2011-07-26 3 views
1

Я хочу иметь возможность изменять элементы массива, которые находятся в родительском pid. Вот несколько примеров коды:PHP pcntl Variable Scope

$arrayContainer = array(
    array(
      "id" => 1, 
      "name" => "Lenny" 
    ), 
    array(
      "id" => 2, 
      "name" => "Dudley" 
    ), 
    array(
      "id" => 3, 
      "name" => "Simon" 
    ), 
); 

foreach ($arrayContainer as $key => $element) { 
    $pid = pcntl_fork(); 
    if($pid == -1) { 
     // Something went wrong (handle errors here) 
     die("Could not fork!"); 
    } elseif($pid == 0) { 
     $arrayContainer[$key]['size'] = 123; 
     $arrayContainer[$key]['fileName'] = 'somefile.txt'; 
     // The child dies after a short while, becoming a zombie 
     exit(); 
    } else { 
     // This part is only executed in the parent 
    } 
} 

Так что, когда этот сценарий заканчивается два элемента я писал в дочернем процессе не существует в конце цикла Еогеаспа. Я не могу изменить массив, который находится в родительском pid от дочернего элемента. Я понимаю, почему, но не могу придумать хорошее решение, которое позволит мне это сделать. Можете ли вы предложить что-нибудь? Глобал или что-то еще?

ответ

2

Процессы parent/children будут совместно использовать один и тот же stdin/stdout. Если процесс PARENT переназначает свой stdin/stdout перед каждым вызовом fork(), вы можете иметь выделенные stdins/stdouts для каждого дочернего элемента. Это позволит вам говорить с каждым ребенком, используя свой собственный канал связи, а также слушать каждого ребенка по отдельности.

Тогда просто вопрос, связанный с простым протоколом связи, чтобы дети передавали модифицированные данные родителям.

+0

yup, memcached it. – gprime

+1

@Marc B. Не могли бы вы привести здесь простой пример? Я заинтересован! – Cesar

3

вы должны попробовать использовать общую память: http://www.php.net/manual/en/ref.shmop.php

, имеющий хорошо известное имя для общей памяти позволит вам shmop_open() в родительском и детей в случае необходимости. будьте осторожны, вы должны использовать семафор для защиты этой разделяемой памяти, чтобы одновременно не записывались две записи. то есть иметь взаимную исключительную блокировку в общей памяти

+0

Да, я фактически реорганизую его прямо сейчас, используя memcached. Просто нужно изменить мою логику, но результат будет хорошим. – gprime