海运的博客

PHP多进程

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

<?php
$cmds=array(a,b,c,d);
foreach($cmds as $cmd){
    $pid = pcntl_fork();
    if($pid == -1) {
        exit("pid fork error");
    }   
    if($pid) { //主进程段,控制子进程数量
        static $max = 0;
        $max++;
        if($max >= 5) {
            pcntl_wait($status); //阻塞父进程,直到子进程结束
            $max--;
        }   
    } else { //子进程执行命令
        $pid = posix_getpid();
        echo "$pid----$cmd\n\n";
        exit(0);
    }   
}   
?>

或:

<?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--;
   }

此内容被密码保护

发布时间:November 22, 2013 // 分类:Mail // No Comments

请输入密码访问

此内容被密码保护

发布时间:November 21, 2013 // 分类:Mail // No Comments

请输入密码访问

此内容被密码保护

发布时间:November 20, 2013 // 分类:Mail // No Comments

请输入密码访问

此内容被密码保护

发布时间:November 16, 2013 // 分类:Mail // No Comments

请输入密码访问

分类
最新文章
最近回复
  • 海运: 正常情况下编译整个内核执行make menuconfig后就不会出现此提示,当单独编译单个模块...
  • oijq: 就是用的armbian的配置文件哈,按你的教程做的,在执行make LOCALVERSION=...
  • 海运: 使用armbian的配置文件,其它添加或修改自己懂的部分,不懂的就不要碰了。
  • oijq: 编译时这些选项全部选Y吗?Actions Semi Platforms (ARCH_ACTIO...
  • 海运: n1编译bbr内核模块参考这个:https://www.haiyun.me/archives/...
  • jiqz: make M=net/ipv4/ CONFIG_TCP_CONG_BBR=m modules编...
  • ruralhunter: 哦,文档里应该是对的,是.config
  • ruralhunter: cp /mnt/boot/config-4.18.7-aml-s9xxx .config这里应...
  • 海运: 你是编译不成功呢?还是编译后不能运行呢?还是运行后不能访问web界面呢?
  • 白墨: 可能不清楚就是编译安装后启动后访问不了web界面