pcntl_fork()的手册说:
pcntl_fork() 函数创建一个子进程,该子进程与父进程的区别仅在于它的 PID 和 PPID。
然而,运行这个简单的测试让我感到惊讶:
class Foo
{
public function bar()
{
if (pcntl_fork()) {
echo spl_object_hash($this), PHP_EOL;
} else {
echo spl_object_hash($this), PHP_EOL;
}
}
}
(new Foo)->bar();
结果如下所示:
000000005ec7fd31000000003f0fcfe6
000000006b4cd5fc000000007fee8ab7
从文档的内容来看,我希望父母和孩子共享相同的变量,特别是当从一个对象中进行 fork() 时,我希望对对象的引用在两者中都是相同的过程。但上面的例子表明他们不是。
有趣的是,这里没有发生克隆,看起来对象只是被复制了。如果我添加一个__clone()
函数,我可以看到它在分叉期间没有被调用。
两个进程不共享变量/对象的任何原因,或者对主题人员的任何良好阅读?