Php分叉和内存共享让我疯狂

时间:2013-01-18 11:58:41

标签: php fork pcntl

我已经过了几个小时和几天来找到为什么php分享我的分叉子节点之间的内存,我想如果父节点在分叉之前在函数中设置了var,那么函数将始终返回相同的结果孩子:〜

new mytest;
class mytest{
    var $t = 'Parent';
    public function __construct(){              
        //$this->runChildProcess($i);       

        $pidsCount = 0;
        for($i = 0; $i < 5; $i++) { 
            $pids[$pidsCount] = pcntl_fork();
            if($pids[$pidsCount]) {
                $this->t = 'Parent';
                // i am the parent
                $pidsCount++;
            }
            else {
                $this->t = 'Enfant';
                // i am the child
                $this->runChildProcess($i);
                exit();
            }
        }
        for($i = 0; $i < $pidsCount; $i++) {
            pcntl_waitpid($pids[$i], $status, WUNTRACED);
        }
    }

    function runChildProcess($i) {
        $a = rand(0,100)."\n";
        echo $this->t.' : '.$a;
    }   
}

如果你运行这个样本就可以了,孩子们会输出不同的数字。 但是,如果您取消对第一个 $this->runChildProcess($i); 的评论,那么您会看到所有孩子都会返回相同的结果(第一个由孩子计算)

我不知道如何处理:(

1 个答案:

答案 0 :(得分:1)

我认为这与内存共享无关。您只是看到rand的行为。

在该行注释掉后,每个孩子第一次调用rand,因此每个孩子都会独立播种。

取消注释该行后,{<1}}播放之前任何子节点分叉。所以他们都看到了相同的种子。