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

PHP使用curl_multi实现并发请求的方法示例

发布:smiling 来源: PHP粉丝网  添加日期:2021-09-15 10:47:47 浏览: 评论:0 

这篇文章主要介绍了PHP使用curl_multi实现并发请求的方法,结合实例形式分析了php封装curl_multi实现的并发请求相关操作技巧,需要的朋友可以参考下。

本文实例讲述了PHP使用curl_multi实现并发请求的方法,分享给大家供大家参考,具体如下:

  1. class CurlMultiUtil { 
  2.   /** 
  3.   * 根据url,postData获取curl请求对象,这个比较简单,可以看官方文档 
  4.   */ 
  5.   private static function getCurlObject($url,$postData=array(),$header=array()){ 
  6.     $options = array(); 
  7.     $url = trim($url); 
  8.     $options[CURLOPT_URL] = $url
  9.     $options[CURLOPT_TIMEOUT] = 3; 
  10.     $options[CURLOPT_RETURNTRANSFER] = true; 
  11.     foreach($header as $key=>$value){ 
  12.       $options[$key] =$value
  13.     } 
  14.     if(!emptyempty($postData) && is_array($postData)){ 
  15.       $options[CURLOPT_POST] = true; 
  16.       $options[CURLOPT_POSTFIELDS] = http_build_query($postData); 
  17.     } 
  18.     if(stripos($url,'https') === 0){ 
  19.       $options[CURLOPT_SSL_VERIFYPEER] = false; 
  20.     } 
  21.     $ch = curl_init(); 
  22.     curl_setopt_array($ch,$options); 
  23.     return $ch
  24.   } 
  25.   /** 
  26.    * [request description] 
  27.    * @param [type] $chList 
  28.    * @return [type] 
  29.    */ 
  30.   private static function request($chList){ 
  31.     $downloader = curl_multi_init(); 
  32.     // 将三个待请求对象放入下载器中 
  33.     foreach ($chList as $ch){ 
  34.       curl_multi_add_handle($downloader,$ch); 
  35.     } 
  36.     $res = array(); 
  37.     // 轮询 
  38.     do { 
  39.       while (($execrun = curl_multi_exec($downloader$running)) == CURLM_CALL_MULTI_PERFORM); 
  40.       if ($execrun != CURLM_OK) { 
  41.         break
  42.       } 
  43.       // 一旦有一个请求完成,找出来,处理,因为curl底层是select,所以最大受限于1024 
  44.       while ($done = curl_multi_info_read($downloader)){ 
  45.         // 从请求中获取信息、内容、错误 
  46.         // $info = curl_getinfo($done['handle']); 
  47.         $output = curl_multi_getcontent($done['handle']); 
  48.         // $error = curl_error($done['handle']); 
  49.         $res[] = $output
  50.         // 把请求已经完成了得 curl handle 删除 
  51.         curl_multi_remove_handle($downloader$done['handle']); 
  52.       } 
  53.       // 当没有数据的时候进行堵塞,把 CPU 使用权交出来,避免上面 do 死循环空跑数据导致 CPU 100% 
  54.       if ($running) { 
  55.         $rel = curl_multi_select($downloader, 1); 
  56.         if($rel == -1){ 
  57.           usleep(1000); 
  58.         } 
  59.       } 
  60.       if($running == false){ 
  61.         break
  62.       } 
  63.     }while(true); 
  64.     curl_multi_close($downloader); 
  65.     return $res
  66.   } 
  67.   /** 
  68.    * [get description] 
  69.    * @param [type] $urlArr 
  70.    * @return [type] 
  71.    */ 
  72.   public static function get($urlArr){ 
  73.     $data = array(); 
  74.     if (!emptyempty($urlArr)) { 
  75.       $chList = array(); 
  76.       foreach ($urlArr as $key => $url) { 
  77.         $chList[] = self::getCurlObject($url); 
  78.       } 
  79.       $data = self::request($chList); 
  80.     } 
  81.     return $data
  82.   } 
  83. }

Tags: curl_multi PHP并发请求

分享到: