Heim > Fragen und Antworten > Hauptteil
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++; } }
这样的做法相当于每次启动一个进程,循环执行,相当于单进程处理任务,如何做到多进程
三叔2016-10-22 10:11:05
看到个帖子说到有个扩展可以实现子进程:Thread
大概描述了一下我的思路,这部分接触的不多,请多指教。
jobs = $jobs; for($i = 0;$i < $threadnum;$i++){ $this->threads[$i] = new childThread(); } $this->doJob(); } /** * scan the thread. * * @return bool|@thread */ public function scan() { if(count($this->jobs) <=0) return 'no jobs!'; foreach($this->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); } }