海运的博客

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

请输入密码访问

分类
最新文章
最近回复
  • 海运: 你是编译不成功呢?还是编译后不能运行呢?还是运行后不能访问web界面呢?
  • 白墨: 可能不清楚就是编译安装后启动后访问不了web界面
  • 白墨: 你好博主按照你的教程是编译安装不了的,在centos7版本下,我在开源镜像站下载centos7...
  • 感谢: 好的谢谢。
  • 海运: 可在github选择指定的branch或tag查看Makefile文件内核版本git指定bra...
  • 感谢: 请问一下“git checkout 20181012”这条命令是什么意思,没有google到。...
  • 海运: 抱歉,我没用蓝牙,现在N1在稳定挂PT中,没法折腾了。
  • hxhw: 大神能弄一個N1盒子開啟藍芽的教程不?我目前的藍芽識別不了似的(BD Address: 00:...
  • 海运: 抱歉,没用过wireguard,不了解具体情况。看错误提示是创建虚拟网卡的类型wireguar...
  • zhu tie: 本人小白我想在n1上装wireguard,安装后错误信息如下:wg-quick up wg0[...
页面执行耗时:0.0804秒。-->