PHP使用pcntl_fork()实现多进程并发操作

前提:在Windows下不可用,在Linux下需要编译运行。

pcntl_fork()函数就是为当前的进程创建一个子进程,并且先运行父进程,返回的是子进程的PID。可以调用getpid()来获取子进程的pid。
父进程的pid为子进程的进程号(>0),子进程的pid为0,fork失败则返回-1。
父进程运行完了会接着运行子进程,这时子进程会从执行pcntl_fork()的那条语句开始执行(包括此函数),但是此时它返回的是零(代表这是一个子进程)。

注意:父进程的阻塞同时会阻塞子进程,但是父进程的结束不影响子进程的运行。

例一:

<?php 
$pid = pcntl_fork();
if ($pid == -1) {
    die('could not fork');
} else if ($pid) {
    echo ($pid."\n");   //父进程
} else {
    echo ($pid."\n");   //子进程
}
?>

结果输出两次,一个是fork出的子进程号,另一个是0。

例二:

<?php
for ($i=0;$i<3;$i++){
    $pid = pcntl_fork(); 
    if ($pid == -1) { 
        die('could not fork'); 
    } else if ($pid) { 
        echo ($pid."\n");  //父进程 
    } else { 
        echo ($pid."\n");  //子进程 
    } 
} 
?>

结果输出14次。父进程七次子进程七次。

Tips:

exit 会让当前进程断子绝孙
多进程执行时,什么时候执行哪一段并不确定,由系统调度说了算,可以试着输出试试。

 

刚接触多进程和多线程,有问题欢迎指正交流~

 

 

 

发表评论