PHP pcntl_fork但仍然可以同步工作

时间:2016-12-01 08:04:09

标签: php

我是新手使用pcntl_fork。 这是我的代码:

<?php
    for($i = 0; $i < 3 ; $i++){
        $pid = pcntl_fork();
        if($pid == -1){
            echo "error\n";
        }elseif($pid == 0){
            echo "child(".getmypid().")\n";
            sleep(3);
            exit();
        }else{
            pcntl_wait($status);
        }
    }
    ?>

3进程不会同时回显。 似乎第二个孩子等待第一个孩子,依此类推。 如何让3个流程并行工作?

1 个答案:

答案 0 :(得分:0)

我的朋友解决了这个问题。等待前一个子进程的子进程是由第11行引起的:

pcntl_wait($status);

它会导致父级等待上一个进程,然后在第一个进程结束时启动下一个进程。

这是正确的代码:

$pidList = array();
for($i = 0; $i < 3 ; $i++){
    $pid = pcntl_fork();
    if($pid == -1){
        echo "error\n";
    }elseif($pid == 0){
        echo "child(".getmypid().")\n";
        sleep(3);
        exit();
    }else{
        array_push($pidList, $pid);
    }
}
if($pid != 0){
    foreach($pidList as $pid){
        pcntl_waitpid($pid, $status);
    }
}