当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP多线程之内部多线程实例分析

发布:smiling 来源: PHP粉丝网  添加日期:2021-05-15 22:24:37 浏览: 评论:0 

这篇文章主要介绍了PHP多线程之内部多线程,实例分析了php多线程的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例分析了PHP多线程之内部多线程用法,分享给大家供大家参考,具体如下:

  1. <?php 
  2. class Http_MultiRequest 
  3.     //要并行抓取的url 列表 
  4.     private $urls = array(); 
  5.     //curl 的选项 
  6.     private $options
  7.     //构造函数 
  8.     function __construct($options = array()) 
  9.     { 
  10.         $this->setOptions($options); 
  11.     } 
  12.     //设置url 列表 
  13.     function setUrls($urls
  14.     { 
  15.         $this->urls = $urls
  16.         return $this
  17.     } 
  18.     //设置选项 
  19.     function setOptions($options
  20.     { 
  21.         $options[CURLOPT_RETURNTRANSFER] = 1; 
  22.         if (isset($options['HTTP_POST'])) 
  23.         { 
  24.             curl_setopt($ch, CURLOPT_POST, 1); 
  25.             curl_setopt($ch, CURLOPT_POSTFIELDS, $options['HTTP_POST']); 
  26.             unset($options['HTTP_POST']); 
  27.         } 
  28.         if (!isset($options[CURLOPT_USERAGENT])) 
  29.         { 
  30.             $options[CURLOPT_USERAGENT] = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)'
  31.         } 
  32.         if (!isset($options[CURLOPT_FOLLOWLOCATION])) 
  33.         { 
  34.             $options[CURLOPT_FOLLOWLOCATION] = 1; 
  35.         } 
  36.         if (!isset($options[CURLOPT_HEADER])) 
  37.         { 
  38.             $options[CURLOPT_HEADER] = 0; 
  39.         } 
  40.         $this->options = $options
  41.     } 
  42.     //并行抓取所有的内容 
  43.     function exec() 
  44.     { 
  45.         if(emptyempty($this->urls) || !is_array($this->urls)) 
  46.         { 
  47.             return false; 
  48.         } 
  49.         $curl = $data = array(); 
  50.         $mh = curl_multi_init(); 
  51.         foreach($this->urls as $k => $v
  52.         { 
  53.             $curl[$k] = $this->addHandle($mh$v); 
  54.         } 
  55.         $this->execMulitHandle($mh); 
  56.         foreach($this->urls as $k => $v
  57.         { 
  58.             $data[$k] = curl_multi_getcontent($curl[$k]); 
  59.             curl_multi_remove_handle($mh$curl[$k]); 
  60.         } 
  61.         curl_multi_close($mh); 
  62.         return $data
  63.     } 
  64.     //只抓取一个网页的内容。 
  65.     function execOne($url
  66.     { 
  67.         if (emptyempty($url)) { 
  68.             return false; 
  69.         } 
  70.         $ch = curl_init($url); 
  71.         $this->setOneOption($ch); 
  72.         $content = curl_exec($ch); 
  73.         curl_close($ch); 
  74.         return $content
  75.     } 
  76.     //内部函数,设置某个handle 的选项 
  77.     private function setOneOption($ch
  78.     { 
  79.         curl_setopt_array($ch$this->options); 
  80.     } 
  81.     //添加一个新的并行抓取 handle 
  82.     private function addHandle($mh$url
  83.     { 
  84.         $ch = curl_init($url); 
  85.         $this->setOneOption($ch); 
  86.         curl_multi_add_handle($mh$ch); 
  87.         return $ch
  88.     } 
  89.     //并行执行(这样的写法是一个常见的错误,我这里还是采用这样的写法,这个写法 
  90.     //下载一个小文件都可能导致cup占用100%, 并且,这个循环会运行10万次以上 
  91.     //这是一个典型的不懂原理产生的错误。这个错误在PHP官方的文档上都相当的常见。) 
  92.     private function execMulitHandle($mh
  93.     { 
  94.         $running = null; 
  95.         do { 
  96.             curl_multi_exec($mh$running); 
  97.         } while ($running > 0); 
  98.     } 
  99. /*下面是上面的类的一个测试的例子:*/ 
  100. $urls = array("http://baidu.com""http://baidu.com""http://baidu.com""http://baidu.com""http://baidu.com""http://baidu.com""http://www.google.com""http://www.sina.com.cn", ); 
  101. $m = new Http_MultiRequest(); 
  102. $t = microtime(true); 
  103. $m->setUrls($urls); 
  104. //parallel fetch(并行抓取): 
  105. $data = $m->exec(); 
  106. $parallel_time = microtime(true) - $t
  107. echo $parallel_time . "\n"
  108. $t = microtime(true); 
  109. //serial fetch(串行抓取): 
  110. foreach ($urls as $url
  111.     $data[] = $m->execOne($url); 
  112. $serial_time = microtime(true) - $t
  113. echo $serial_time . "\n"

希望本文所述对大家的php程序设计有所帮助。

Tags: PHP多线程 PHP内部多线程

分享到: