加入收藏 | 设为首页 | 会员中心 | 我要投稿 武汉站长网 (https://www.027zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

一文带你了解php多进程,php多进程操作实例解析

发布时间:2021-12-30 20:35:58 所属栏目:PHP教程 来源:互联网
导读:这篇文章给大家介绍的是关于PHP的多进程操作,文本有php的多进程操作实例,具有一定的借鉴价值,有这方面学习需要的朋友可以参考。 php的多进程处理依赖于pcntl扩展,通过pcntl_fork创建子进程来进行并行处理。 例1如下: ?php $pid = pcntl_fork(); if($p
  这篇文章给大家介绍的是关于PHP的多进程操作,文本有php的多进程操作实例,具有一定的借鉴价值,有这方面学习需要的朋友可以参考。
 
       php的多进程处理依赖于pcntl扩展,通过pcntl_fork创建子进程来进行并行处理。
 
       例1如下:
 
<?php
$pid = pcntl_fork();
 
if($pid == -1) {
  //错误处理:创建子进程失败时返回-1.
  die('fork error');
} else if ($pid) {
  //父进程会得到子进程号,所以这里是父进程执行的逻辑
  echo "parent n";
  //等待子进程中断,防止子进程成为僵尸进程。
  pcntl_wait($status);
} else {
  //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
  echo "child n";
 
  exit;
}
 
       pcntl_fork创建了子进程,父进程和子进程都继续向下执行,而不同是父进程会获取子进程的$pid也就是$pid不为零。而子进程会获取$pid为零。通过if else语句判断$pid我们就可以在指定位置写上不同的逻辑代码。
 
       上述代码会分别输出parent和child。那么输出的parent和child是否会有顺序之分?是父进程会先执行?
 
       例2如下:
 
<?php
$pid = pcntl_fork();
 
if($pid == -1) {
  die('fork error');
} else if ($pid) {
  sleep(3);
  echo "parent n";
  pcntl_wait($status);
} else {
  echo "child n";
 
  exit;
}
 
       我们在父进程中通过sleep来延缓执行,看看效果。结果是,很快输出了child,等待了接近3秒后,才输出parent。所以父进程和子进程的执行是相对独立的,没有先后之分。
 
       那么问题又来了?pcntl_wait是做什么用的?会挂起当前进程,直到子进程退出,如果子进程在调用此函数之前就已退出,此函数会立刻返回。子进程使用的资源将被释放。
 
       例3如下:
 
<?php
$pid = pcntl_fork();
 
if($pid == -1) {
  die('fork error');
} else if ($pid) {
  pcntl_wait ($status);
  echo "parent n";
} else {
  sleep(3);
  echo "child n";
 
  exit;
}
 
       上述代码,我们可以看到,父进程执行pcntl_wait时就已经挂起,直到等待3秒后输出child,子进程退出后。父进程继续执行,输出parent。
 
       例4如下:
 
<?php
define('FORK_NUMS', 3);
 
$pids = array();
 
for($i = 0; $i < FORK_NUMS; ++$i) {
  $pids[$i] = pcntl_fork();
  if($pids[$i] == -1) {
    die('fork error');
  } else if ($pids[$i]) {
    pcntl_waitpid($pids[$i], $status);
    echo "pernet n";
  } else {
    sleep(3);
    echo "child id:" . getmypid() . " n";
    exit;
  }
}
 
       上述代码,我们创建3个子进程,父进程分别挂起等待子进程结束后,输出parent。
 
}
 
       输出结果如下:
 
child id:19118
child id:19119
child id:19120
parent
parent
parent
 
       为什么上述代码跟例4的输出结果不一样?
 
       我们可以看到例5的pcntl_waitpid函数放在了foreach中,foreach代码是在主进程中,也就是父进程的代码中。当执行foreach时,可能子进程已经全部执行完毕并退出。pcntl_waitpid会立刻返回,连续输出三个parent。


一文带你了解php多进程,php多进程操作实例解析

(编辑:武汉站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读