海运的博客

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

请输入密码访问

分类
最新文章
最近回复
  • track: NAT 部分没处理,这块感觉有问题。
  • yu: 查到有用的资料很幸福!
  • boscotsang: 请问下服务器端如何控制权限让通过权限认证的客户端才能连接?现在这样只要有自编译的客户端程序都可...
  • yck932: 大侠,请问哪里有 tunnels 详细参考资料,谢谢
  • bubble: 现在linux 4.9以上的内核有个bbr的参数,用这个bbr比用锐速效果更好,可参考我的博文...
  • wang: openwrt 只有 tmp/etc/miniupnpd.conf 修改后又重置了,其他路径找...
  • wbq: 可以了 只是https透明代理如何做呢?
  • wbq: 你的这个配置需要浏览器设置代理ip+port, 现在假设不设置,只配置客户端网关为Nginx那...
  • wbq: 您好,想用Nginx做个透明代理,客户端机器配置下网关(即Nginx那台机器),客户端dns配...
  • ccc: 可以提供易调用openssl常用函数吗?