PHP pcntl可变范围

时间:2011-07-26 19:58:22

标签: php fork pcntl

我希望能够修改父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中父pid中的数组。我明白为什么,但想不出一个能让我这么好的解决方案。你能提出什么建议吗?全球还是什么?

2 个答案:

答案 0 :(得分:3)

你应该尝试使用共享内存:http://www.php.net/manual/en/ref.shmop.php

拥有共享内存的众所周知的名称将允许您根据需要在父级和子级中使用shmop_open()。请注意,您应该使用信号量来保护此共享内存,这样就不会同时发生两次写入。也就是说,在共享内存上有一个互斥锁

答案 1 :(得分:2)

父/子进程将共享相同的stdin / stdout。如果 PARENT 进程在每次fork()调用之前重新映射其stdin / stdout,则可以为每个子项设置专用的stdins / stdouts。这样您就可以使用自己的沟通渠道与每个孩子交谈,并且也可以单独听取每个孩子的意见。

然后,只需要提供一个简单的通信协议就可以让孩子们将修改过的数据传回给父母。