加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP多线程之内部多线程实例详解

发布时间:2022-07-01 15:52:24 所属栏目:PHP教程 来源:互联网
导读:这篇文章主要介绍了PHP多线程之内部多线程,实例分析了php多线程的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例分析了PHP多线程之内部多线程用法,分享给大家供大家参考,具体如下: ?php class Http_MultiRequest { //要并行抓取的url 列表 p
  这篇文章主要介绍了PHP多线程之内部多线程,实例分析了php多线程的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
 
  本文实例分析了PHP多线程之内部多线程用法,分享给大家供大家参考,具体如下:
 
  <?php
  class Http_MultiRequest
  {
      //要并行抓取的url 列表
      private $urls = array();
      //curl 的选项
      private $options;
      //构造函数
           {
              curl_setopt($ch, CURLOPT_POST, 1);
              curl_setopt($ch, CURLOPT_POSTFIELDS, $options['HTTP_POST']);
              unset($options['HTTP_POST']);
          }
          if (!isset($options[CURLOPT_USERAGENT]))
          {
              $options[CURLOPT_USERAGENT] = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)';
          }
          if (!isset($options[CURLOPT_FOLLOWLOCATION]))
          {
              $options[CURLOPT_FOLLOWLOCATION] = 1;
          }
          if (!isset($options[CURLOPT_HEADER]))
          {
              $options[CURLOPT_HEADER] = 0;
          }
          $this->options = $options;
      }
      //并行抓取所有的内容
      function exec()
      {
          if(emptyempty($this->urls) || !is_array($this->urls))
          {
              return false;
          }
          $curl = $data = array();
          $mh = curl_multi_init();
          foreach($this->urls as $k => $v)
          {
              $curl[$k] = $this->addHandle($mh, $v);
          }
          $this->execMulitHandle($mh);
          foreach($this->urls as $k => $v)
          {
              $data[$k] = curl_multi_getcontent($curl[$k]);
           curl_close($ch);
          return $content;
      }
      //内部函数,设置某个handle 的选项
      private function setOneOption($ch)
      {
          curl_setopt_array($ch, $this->options);
      }
      //添加一个新的并行抓取 handle
      private function addHandle($mh, $url)
      {
          $ch = curl_init($url);
          $this->setOneOption($ch);
          curl_multi_add_handle($mh, $ch);
          return $ch;
      }
      //并行执行(这样的写法是一个常见的错误,我这里还是采用这样的写法,这个写法
      //下载一个小文件都可能导致cup占用100%, 并且,这个循环会运行10万次以上
      //这是一个典型的不懂原理产生的错误。这个错误在PHP官方的文档上都相当的常见。)
      private function execMulitHandle($mh)
      {
          $running = null;
          do {
              curl_multi_exec($mh, $running);
          } while ($running > 0);
      }
  }
  /*下面是上面的类的一个测试的例子:*/
   foreach ($urls as $url)
  {
      $data[] = $m->execOne($url);
  }
  $serial_time = microtime(true) - $t;
  echo $serial_time . "n";
  希望本文所述对大家的php程序设计有所帮助。
 
 

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读