popen如何实现多进程并发执行,循环里的pclose会等待进程完毕再进行下一次循环
高洛峰
高洛峰 2016-10-22 10:08:46
0
1
1372

1.PHP popen如何实现多进程并发执行,循环里的pclose会等待进程完毕再进行下一次循环

2.假设有17个进程要开启,如何实现每次启动5个进程,并且每完成一个进程就关闭一个进程,同时开启下一个进程,也就是说最多只有5个进程同时执行

//启动2个进程
for($i = 0;$i < 2;$i++){
    $command = "$phpPath $destPHPFile >> $logFile$i";
    echo "进程开启时间".date('Y-m-d H:i:s')."\n";
    $resource = popen($command,'r');
    if(is_resource($resource)){
        $success++;
        pclose($resource);//下一次循环会等待上一个进程执行完毕,pclose才会释放资源
        echo date('Y-m-d H:i:s')." 进程:".$i."启动完毕,执行完毕并关闭,开启下一个进程\n";
    }else{
        $failure++;
    }
}

这样的做法相当于每次启动一个进程,循环执行,相当于单进程处理任务,如何做到多进程

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

reply all(1)
三叔

看到个帖子说到有个扩展可以实现子进程:Thread

大概描述了一下我的思路,这部分接触的不多,请多指教。

jobs = $jobs;
    for($i = 0;$i threads[$i] = new childThread();
    }
    $this->doJob();
  }
  /**
   * scan the thread.
   *
   * @return bool|@thread
   */
  public function scan()
  {
    if(count($this->jobs) threads as $key => $obj)
    {
      if($obj->busy === false)
      {
        $idleThreads[] = $obj;
      }
    }
    if(count($idleThreads)>0)
    {
      $this->doJob($idleThreads);
      return false;
    }
    else
    { 
      return false;
    }
  }
  protected function doJob($idleThreads){
    foreach($idleThreads as $id => $thread){
      $thread->job = $this->getJob();
      $thread->start();
    }
  }
  protected function getJob(){
    $r = $this->jobs[0];
    unset($this->jobs[0]);
    return $r;
  }
  
}
class childThread extends Thread{
  public $job;
  public $busy=false;
  public function run(){
    //set busy=true
    $this->busy = true;
    //do job!

    //set busy=false
    $this->busy = false;
  }
}
//script:

$pool = new Threads(5,array(1,2,3...17));
while(1){
  if($pool->scan() == 'no jobs!'){
    exit();
  }else{
    sleep(1000);
  }
}


Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template