设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP多线程pthreads运用例子

发布时间:2022-02-23 15:05 所属栏目:121 来源:互联网
导读:php本身对于多线程处理是不够理想的,但如果我们使用pthreads性能会有所提高了,下面来看一个PHP多线程pthreads使用例子. ?php declare(ticks = 1); $running = 1; //信号处理函数 function sig_handler($signo) { switch ($signo) { case SIGINT: finish();
  php本身对于多线程处理是不够理想的,但如果我们使用pthreads性能会有所提高了,下面来看一个PHP多线程pthreads使用例子.
 
  <?php
  declare(ticks = 1);
  $running = 1;
  
  //信号处理函数
  function sig_handler($signo)
  {
    switch ($signo) {
    case SIGINT:
      finish();
      break;
    default:
      break;
    }
  }
  
  pcntl_signal(SIGINT, "sig_handler");
  class test extends /Thread {
    public $url;
    public $result;
  
    public function __construct($url) {
      $this->url = $url;
    }
  
    public function run() {
      if ($this->url) {
        $this->result = model_http_curl_get($this->url);
      }
    }
  }
  function model_http_curl_get($url) {
    $curl = curl_init();   
    curl_setopt($curl, CURLOPT_URL, $url);   
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);   
    curl_setopt($curl, CURLOPT_TIMEOUT, 5);   
    curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)');   
    $result = curl_exec($curl);   
    curl_close($curl);   
    return $result;   
  }
  for ($i = 0; $i < 500; $i++) {
    $urls[] = 'http://www.baidu.com/s?wd='. rand(10000, 20000);
  }
  
  $pool = array();
  for ($i=1;$i<=5;$i++) {
    $key = uniqid();
    $url = array_shift($urls);
    $pool[$key] = new test($url);
    $pool[$key]->start();
    echo "启动线程$key/n";
  }
  while ($urls && $running) {
    foreach ($pool as $key=>$worker) {
      if(! $worker->isRunning()){
        //unset($pool[$key]);
        echo "线程".$key."已结束/n";
        $url = array_shift($urls);
        $pool[$key] = new test($url);
        $pool[$key]->start();
        echo "启动线程$key/n";
      }
    }
    usleep(1000);
  }//Cuoxin.com
  
  function finish() {
    global $running;
    global $pool;
    $running = 0;
    echo "接收到信号,等待运行中线程结束/n";
    foreach ($pool as $key=>$worker) {
      if ($pool[$key]->join()) {
        var_dump($pool[$key]->result);
      }
    }
  }
  ?>
 

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读