我已经过了几个小时和几天来找到为什么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);
的评论,那么您会看到所有孩子都会返回相同的结果(第一个由孩子计算)
我不知道如何处理:(
答案 0 :(得分:1)
我认为这与内存共享无关。您只是看到rand
的行为。
在该行注释掉后,每个孩子第一次调用rand
,因此每个孩子都会独立播种。
取消注释该行后,{<1}}播放之前任何子节点分叉。所以他们都看到了相同的种子。