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

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

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

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

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

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

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

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

分享到: