如何让子进程将值返回给父进程

时间:2014-09-14 05:42:51

标签: php multiprocessing shared-memory pcntl

我试图在多个进程中运行for循环,并且需要每个for循环写入父进程中的数组。我已尝试使用数组退出子进程,但pcntl_wexitstatus()只能返回一个整数。所以我被卡住了。

我对多处理非常陌生,但是,我看到有人说在父母和孩子之间共享变量的好方法是shmop,但我真的不知道如何利用它。

这是我的代码:

$output = array();

for ($i = 0; $i < 4; $i++) {
    $pid = pcntl_fork();
    $start = ($i == 0) ? 1 : (1000000 * $i) + 1;
    $end = 1000000 * ($i + 1);

    if (!$pid) {
        for ($run = $start; $run <= $end; $run++) {
            $output[$i][] = 'Run ' . $run;
        }

        exit($i);
    }
}

while (pcntl_waitpid(0, $status) != -1) {
    $status = pcntl_wexitstatus($status);
}

echo implode("\n", $output);

为了澄清我期望发生的事情,$output数组应包含四个项目,这些项目也是每个项目包含一百万个项目的数组。它应该是这样的:

Array
(
    [0] => Array
        (
            [0] => Run 1
            [1] => Run 2
            [2] => Run 3
            ...
        )

    [1] => Array
        (
            [0] => Run 1000001
            [1] => Run 1000002
            [2] => Run 1000003
            ...
        )

    [2] => Array
        (
            [0] => Run 2000001
            [1] => Run 2000002
            [2] => Run 2000003
            ...
        )

    [3] => Array
        (
            [0] => Run 3000001
            [1] => Run 3000002
            [2] => Run 3000003
            ...
        )

)

1 个答案:

答案 0 :(得分:0)

Php fork(比如NIX中的fork)这只是进程的完整副本和她的环境。父进程不知道儿童的变化。孩子们不能把结果传给父母。 Parent只能检查子进程的结束。如果要传递数据,可以使用共享内存。但要注意! php中的共享内存这不是真实的(OS)共享内存。但是对于php它可以工作。

您可以在此处找到解决方案:https://github.com/search?q=php+fork