我想实现以下目标:
初始化一个数组。子进程将一些元素添加到数组中。父进程向数组添加一些元素。最后在退出之前,打印所有元素。
以下是我写的代码:
<?php
$values=array();
$pid = pcntl_fork();
if (!$pid) {
sleep(2);
$values[]="Put by child";
exit(0);
}
$values[]="Put by parent";
pcntl_waitpid($pid, $status);
print_r($values);
?>
但是,它只打印一个值 - Put by parent
。有人可以解释一下这种行为并建议正确的代码吗?
此致 JP
答案 0 :(得分:6)
(抱歉转贴)
我建议看一下 socket_create_pair()。
在PHP手册中是一个很短的&amp; fork() - 父级和子级之间的进程间通信(IPC)的简单示例。
使用序列化()和反序列化()您甚至可以传输复杂的数据类型,例如数组......
答案 1 :(得分:2)
分叉的孩子一旦写到任何地方就会获得他们自己的专用内存空间 - 这就是“写时复制”。虽然shmop确实提供了对公共内存位置的访问,但是不会在子代之间共享实际的PHP变量和脚本中定义的内容。
做$ x = 7;在一个孩子身上不会让其他孩子的$ x也变成7.每个孩子都有自己的专用$ x,完全独立于其他人的副本。
本地域套接字最简单。让父母在fork之前为每个孩子用fsockopen打开一个。这样,每个孩子可以拥有一个通讯渠道:http://php.net/manual/en/transports.unix.php和http://php.net/manual/en/transports.unix.php。
您还可以共享内存,或者在两个进程之间打开双向通信通道,并构建一个api来回传送数据。
只要父子知道共享内存段的键/键可以在pcnlt_fork之前执行shmop_open。但请记住,pcnlt_fork在子进程中返回0,而在创建子进程失败时返回-1(检查注释/混淆/附近的代码)。父亲将在$ pid中创建刚刚创建的子进程的PID。
在此处查看:
答案 2 :(得分:0)
孩子的代码缺少print_r()
声明。
父母不会打印孩子添加到values
的内容,因为添加是在子进程被fork()
关闭后完成的,并且由此获得了自己的副本prcoess'记忆。
来自fork
-tag's excerpt(我强调):
fork()
函数是通过复制调用进程来创建新进程的Unix / Linux / POSIX方式。
这种forking行为与所有线程共享相同地址空间的线程不同。