1

我正在尝试跨多个进程运行 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
            ...
        )

)
4

1 回答 1

0

Php fork(就像 NIX 中的 fork)这只是进程和她的环境的完整副本。父进程不知道子进程的变化。并且孩子不能将结果传递给父母。父进程只能检查子进程的结束。如果你想传递数据,你可以使用共享内存。但是注意!php 中的共享内存这不是真正的(OS)共享内存。但对于 php 它可以工作。

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

于 2014-09-14T07:01:26.930 回答