我想用PHP控制WIN服务器自带DNS服务器来动态生成解析记录,经测试单线程效率极低,等待时间长,于是考虑用多线程,下了个pthread扩展,用以下代码进行测试,感觉还是不是多线程的效果。尤其是线程多了,发现和串行效率差不多<?php
class recordadd extends Thread {
  public function __construct($domainhead,$stime){
    $this->domainhead = $domainhead;
$this->stime = $stime;
  }
  public function run(){
  $timediff=microtime(true)-$this->stime;
      echo($this->domainhead." start at $timediff<br>");//这个时间随着线程数量的增大而增大,很奇怪,感觉根本不像是并发执行
 exec("dnscmd . /recordadd example.com $this->domainhead A 2.2.2.2",$out);
  //usleep(2000000);//假如去掉exec用这个函数,使用起来发现总运行时间缩小了,像是并发执行
  $timediff=microtime(true)-$this->stime;
  echo($this->domainhead." end at $timediff<br>");//这个时间也随着线程数量的增大而增大,而且线程越多,结束时间越久,照理说多线程每个线程运行时间应该是和只有一个线程运行时间是一样的啊
  }
}
$stime=microtime(true);
$num=100; //线程数量
for($i=0;$i<$num;$i++)
{
$thread[$i] = new recordadd("a".$i,$stime);
$thread[$i]->start();

}
for($i=0;$i<$num;$i++)
{
$thread[$i]->join();
}echo("all done");
?>这段代码目前运行起来是串行效果,如何达到并行效果,如何实现提高效率,请大神指导

解决方案 »

  1.   

    这是因为 exec 是阻塞的,也就是说你调用 exec执行任务之后,会阻塞在那里,当任务结束之后,才会执行下一条代码,所以就变成了串行,没有利用上多线程。你可以再写一个 Work 类实现线程,当需要用到 exec 执行脚本时,new Work,并把任务放到 Work 的  run 里面,调用 Work::start,这样就可以在主线程里开启多个子线程,子线程会被 exec() 阻塞,主线程不受影响,不影响主线程分配任务,这样就可以利用上多线程
      

  2.   

    不好意思,看错了,原因有可能是每次 exec() 都会开启一个进程,应该是进程数量限制了
      

  3.   

    这类需求推荐用go写,如果一定要用php,可以看看swoole插件