PHP pcntl Переменная Область - PullRequest
1 голос
/ 26 июля 2011

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

$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
    }
}

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

Ответы [ 2 ]

3 голосов
/ 27 июля 2011

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

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

2 голосов
/ 27 июля 2011

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

Тогда просто придумать простой протокол связи, который позволит детям передавать измененные данные родителю.

...