使用curl_multi實現並發請求步驟分析

來源:互聯網
上載者:User
這次給大家帶來使用curl_multi實現並發請求步驟分析,使用curl_multi實現並發請求的注意事項有哪些,下面就是實戰案例,一起來看一下。

class CurlMultiUtil {  /**  * 根據url,postData擷取curl請求對象,這個比較簡單,可以看官方文檔  */  private static function getCurlObject($url,$postData=array(),$header=array()){    $options = array();    $url = trim($url);    $options[CURLOPT_URL] = $url;    $options[CURLOPT_TIMEOUT] = 3;    $options[CURLOPT_RETURNTRANSFER] = true;    foreach($header as $key=>$value){      $options[$key] =$value;    }    if(!empty($postData) && is_array($postData)){      $options[CURLOPT_POST] = true;      $options[CURLOPT_POSTFIELDS] = http_build_query($postData);    }    if(stripos($url,'https') === 0){      $options[CURLOPT_SSL_VERIFYPEER] = false;    }    $ch = curl_init();    curl_setopt_array($ch,$options);    return $ch;  }  /**   * [request description]   * @param [type] $chList   * @return [type]   */  private static function request($chList){    $downloader = curl_multi_init();    // 將三個待請求對象放入下載器中    foreach ($chList as $ch){      curl_multi_add_handle($downloader,$ch);    }    $res = array();    // 輪詢    do {      while (($execrun = curl_multi_exec($downloader, $running)) == CURLM_CALL_MULTI_PERFORM);      if ($execrun != CURLM_OK) {        break;      }      // 一旦有一個請求完成,找出來,處理,因為curl底層是select,所以最大受限於1024      while ($done = curl_multi_info_read($downloader)){        // 從請求中擷取資訊、內容、錯誤        // $info = curl_getinfo($done['handle']);        $output = curl_multi_getcontent($done['handle']);        // $error = curl_error($done['handle']);        $res[] = $output;        // 把請求已經完成了得 curl handle 刪除        curl_multi_remove_handle($downloader, $done['handle']);      }      // 當沒有資料的時候進行堵塞,把 CPU 使用權交出來,避免上面 do 死迴圈空跑資料導致 CPU 100%      if ($running) {        $rel = curl_multi_select($downloader, 1);        if($rel == -1){          usleep(1000);        }      }      if($running == false){        break;      }    }while(true);    curl_multi_close($downloader);    return $res;  }  /**   * [get description]   * @param [type] $urlArr   * @return [type]   */  public static function get($urlArr){    $data = array();    if (!empty($urlArr)) {      $chList = array();      foreach ($urlArr as $key => $url) {        $chList[] = self::getCurlObject($url);      }      $data = self::request($chList);    }    return $data;  }}

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

PHP使用file_get_contents發送http請求步驟詳解

PHP通過strace定位排解故障位置並解決

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.