3

我想实现以下目标:

初始化一个数组。子进程将一些元素添加到数组中。父进程将一些元素添加到数组中。最后在退出之前,打印所有元素。

以下是我写的代码:

<?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

4

3 回答 3

7

(对不起交叉发布)

我建议看看socket_create_pair()

在 PHP 手册中是一​​个非常简短且简单的 fork()-parent 和 child 之间的进程间通信 (IPC) 示例。

并且使用serialize()unserialize()你甚至可以传输复杂的数据类型,比如数组......

于 2013-12-06T12:41:56.590 回答
3

分叉的孩子只要在任何地方写入,就会获得他们自己的内存空间专用副本——这就是“写时复制”。虽然 shmop 确实提供了对公共内存位置的访问,但实际的 PHP 变量和脚本中未定义的内容不会在子级之间共享。

做 $x = 7; 在一个孩子中不会使其他孩子中的 $x 也变成 7。每个孩子将有自己的专用 $x 完全独立于其他人的副本。

本地域套接字是最简单的。让父母在分叉前为每个孩子打开一个 fsockopen 。这样您就可以为每个孩子拥有一个通讯频道:http: //php.net/manual/en/transports.unix.phphttp://php.net/manual/en/transports.unix.php

您还可以共享内存,或者在两个进程之间打开双向通信通道,并构建一个小 api 来来回发送数据。

只要父亲和孩子知道共享内存段的密钥/密钥就可以在 pcnlt_fork 之前执行 shmop_open。但请记住,pcnlt_fork 在子进程中返回 0,在创建子进程失败时返回 -1(检查注释 /confusion/ 附近的代码)。父亲将在 $pid 中包含刚刚创建的子进程的 PID。

在这里检查:

http://php.net/manual/es/function.pcntl-fork.php

于 2013-09-28T15:22:01.680 回答
0

孩子的代码缺少该print_r()语句。

父进程不会打印子进程添加的内容values,因为添加是在子进程fork()关闭后完成的,因此它获得了自己的进程内存副本。

fork-tag 的摘录(我强调):

该函数是通过复制调用进程fork()来创建新进程的 Unix/Linux/POSIX 方式。

这种分叉行为不同于所有线程共享相同地址空间的线程。

于 2013-09-28T16:40:52.187 回答