海运的博客

PHP多进程

发布时间:November 26, 2013 // 分类:PHP // No Comments

<?php
function convert($size)
{
  $unit=array('b','kb','mb','gb','tb','pb');
  return @round($size/pow(1024,($i=floor(log($size,1024)))),2).$unit[$i];
}
$childs = array();

for($i = 0; $i < 10; $i++) {
  $pid = pcntl_fork();
  if($pid == -1)
    die('Could not fork');

  if ($pid) { //主进程执行
    echo "parent \n";
    $childs[] = $pid;
  } else { //子进程执行
    for($i =1;$i<10;$i++)
    {
      $pid = posix_getpid();
      echo '当前进程'.$pid.PHP_EOL;
      echo '当前循环'.$i.PHP_EOL;
      echo '占用内存'.convert(memory_get_usage()) . PHP_EOL;
      sleep(1);
    }
    exit();
  }
}

while(count($childs) > 0) {
  foreach($childs as $key => $pid) {
    $res = pcntl_waitpid($pid, $status, WNOHANG);

    if($res == -1 || $res > 0)
      unset($childs[$key]);
  }
  sleep(1);
}

或:

<?php
   function convert($size)
   {
      $unit=array('b','kb','mb','gb','tb','pb');
      return @round($size/pow(1024,($i=floor(log($size,1024)))),2).$unit[$i];
   }
   //最大的子进程数量
   $maxChildPro = 8;
   //当前的子进程数量
   $curChildPro = 0;

   //当子进程退出时,会触发该函数
   function sig_handler($sig)
   {
      global $curChildPro;
      switch($sig)
      { 
         case SIGCHLD:  
         //当前进程数减一,同时控制段会启动一新进程
         $curChildPro--;
         break;
      }
   }

   //配合pcntl_signal使用,简单的说,是为了让系统产生时间云,让信号捕捉函数能够捕捉到信号量
   declare(ticks=1);

   //注册子进程退出时调用的函数。SIGCHLD:在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程。
   pcntl_signal(SIGCHLD, "sig_handler");
   //整个任务控制
   for ($i = 1; $i <= 5; $i++) 
   //while(true)
   {
      $curChildPro++;
      $pid = pcntl_fork();
      if ($pid)    //父进程运行代码
      {
         if ($curChildPro >= $maxChildPro)
         {
            pcntl_wait($status);
         } 
      }
      else        //子进程运行代码
      {
         //子进程多次循环使用再退出
         for($i =1;$i<10;$i++)
         {
            echo '当前进程'.$curChildPro.PHP_EOL;
            echo '当前循环'.$i.PHP_EOL;
            echo '占用内存'.convert(memory_get_usage()) . PHP_EOL;
            sleep(1);
         }
         exit; 
      }
   }

   //主进程等待所有子进程完成后再退出
   while ($curChildPro)
   {
      pcntl_wait($status);
      //各信号控制冲突,造成负数循环
      //$curChildPro--;
   }

标签:php

发表评论

分类
最新文章
最近回复
  • mingyu wen: 写的让我豁然开朗,但请问这句什么意思:有状态的+无状态的,使用dhcpv6有状态分配地址,同时...
  • alex heryy: Androidblue
  • 海运: 不清楚,可尝试使用ubuntu18.04系统按本文方法编译试试。
  • bbr: 大佬,请问debian9编译错误怎么解决? github有人提问,没人解答,只好来这里看看.p...
  • 田博: 如果dts中没有USB信息,这样也能装上?
  • 海运: 正常情况下编译整个内核执行make menuconfig后就不会出现此提示,当单独编译单个模块...
  • oijq: 就是用的armbian的配置文件哈,按你的教程做的,在执行make LOCALVERSION=...
  • 海运: 使用armbian的配置文件,其它添加或修改自己懂的部分,不懂的就不要碰了。
  • oijq: 编译时这些选项全部选Y吗? Actions Semi Platforms (ARCH_ACTI...
  • 海运: n1编译bbr内核模块参考这个:https://www.haiyun.me/archives/...