【问题标题】:PHP fork process - getting child output in parentPHP fork 进程 - 在父级中获取子级输出
【发布时间】:2013-10-04 19:03:41
【问题描述】:

我想实现以下目标:

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

以下是我写的代码:

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

【问题讨论】:

    标签: php fork


    【解决方案1】:

    (对不起,交叉发布)

    我建议看看 socket_create_pair()

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

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

    【讨论】:

      【解决方案2】:

      分叉的孩子只要在任何地方写入内存空间,就会获得他们自己的专用内存空间副本 - 这就是“写时复制”。虽然 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

      【讨论】:

      • 诸如数据库连接之类的资源也在孩子之间共享
      【解决方案3】:

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

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

      来自fork-tag's excerpt(我强调):

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-23
        • 1970-01-01
        • 1970-01-01
        • 2012-05-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多