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

PHP使用CURL_MULTI实现多线程采集的例子

发布:smiling 来源: PHP粉丝网  添加日期:2021-03-26 11:52:17 浏览: 评论:0 

这篇文章主要介绍了PHP使用CURL_MULTI实现多线程采集的例子,CURL_MULTI可以对HTTP进行并发访问,需要的朋友可以参考下

这两天有一客户定制了一个免登录发布模块,因为在模块中需要涉及到很多图片下载的问题,考虑到性能问题,所以特别写了一个CURL_MULTI远程采集网页的函数,以方便以后使用,估计以后都不会使用原来的单线程curl函数去foreach了,其性能对比很明显的。同样获取我的博客的十个不同网页,curl_multi:4.5246081352234,file_get_contents:33.001797914505,将近8倍的效率,可想而知,如果在附件更多的情况下,性能差异就越明显了,希望对您有所帮助!

代码如下:

  1. <?php 
  2. $text = remote(array('https://www.phpfensi.com/','http://www.baidu.com/')); 
  3. print_r($text); 
  4.  
  5. function remote($urls) { 
  6.     if (!is_array($urlsor count($urls) == 0) { 
  7.         return false; 
  8.     } 
  9.  
  10.     $curl = $text = array(); 
  11.     $handle = curl_multi_init(); 
  12.     foreach($urls as $k => $v) { 
  13.         $nurl[$k]= preg_replace('~([^:\/\.]+)~ei'"rawurlencode('\\1')"$v); 
  14.         $curl[$k] = curl_init($nurl[$k]); 
  15.         curl_setopt($curl[$k], CURLOPT_RETURNTRANSFER, 1); 
  16.         curl_setopt($curl[$k], CURLOPT_HEADER, 0); 
  17.         curl_multi_add_handle ($handle$curl[$k]); 
  18.     } 
  19.  
  20.     $active = null; 
  21.     do { 
  22.         $mrc = curl_multi_exec($handle$active); 
  23.     } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
  24.  
  25.     while ($active && $mrc == CURLM_OK) { 
  26.         if (curl_multi_select($handle) != -1) { 
  27.             do { 
  28.                 $mrc = curl_multi_exec($handle$active); 
  29.             } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
  30.         } 
  31.     } 
  32.  
  33.     foreach ($curl as $k => $v) { 
  34.         if (curl_error($curl[$k]) == "") { 
  35.         $text[$k] = (string) curl_multi_getcontent($curl[$k]); 
  36.         } 
  37.         curl_multi_remove_handle($handle$curl[$k]); 
  38.         curl_close($curl[$k]); 
  39.     } 
  40.     curl_multi_close($handle); 
  41.     return $text

Tags: CURL_MULTI PHP多线程采集

分享到: