歡迎您光臨本站 註冊首頁

詳解PHP中curl

←手機掃碼閱讀     sl_ivan @ 2020-06-11 , reply:0

PHP中的curl_multi系列函數可以實現同時請求多個URL來實現併發,而不是像普通curl函數那樣請求後會阻塞,直到結果返回才進行下一個請求。因此在批量請求URL時可通過curl_multi系列函數提升程序的運行效率。

curl普通請求
 

  $startTime = microtime(true);  $chArr = [];  $optArr = [    CURLOPT_URL => 'http://www.httpbin.org/ip',    CURLOPT_HEADER => 0,    CURLOPT_RETURNTRANSFER => 1,  ];  $result = [];    //創建多個curl資源並執行  for ($i=0; $i<10; $i++) {    $chArr[$i] = curl_init();    curl_setopt_array($chArr[$i], $optArr);    $result[$i] = curl_exec($chArr[$i]);    curl_close($chArr[$i]);  }    $endTime = microtime(true);  echo sprintf("use time: %.3f s".PHP_EOL, $endTime - $startTime);

use time: 6.080 s
 

curl_multi併發請求
 

  $startTime = microtime(true);  $chArr = [];  $optArr = [    CURLOPT_URL => 'http://www.httpbin.org/ip',    CURLOPT_HEADER => 0,    CURLOPT_RETURNTRANSFER => 1,  ];  $result = [];    //創建多個curl資源  for ($i=0; $i0 來作為 while 的條件,如下:   * do {   *  $mrc = curl_multi_exec($mh, $active);   * } while ($active > 0);   * 此時如果整個批處理句柄沒有全部執行完畢時,系統會不停的執行 curl_multi_exec 函數,從而導致系統CPU佔用會很高,   * 因此一般不採用這種方案,可以通過 curl_multi_select 函數來達到沒有需要讀取的程序就阻塞住的目的。   */    /**   * $active 為 true 時,即 $mh 批處理之中還有 $ch 句柄等待處理,   * $mrc == CURLM_OK,即上一次 $ch 句柄的讀取或寫入已經執行完畢。   */  while ($active && $mrc == CURLM_OK) {    /**      * 程序進入阻塞狀態,直到批處理中有活動連接(即 $mh 批處理中還有可執行的 $ch 句柄),     * 這樣執行的好處是 $mh 批處理中的 $ch 句柄會在讀取或寫入數據結束後($mrc == CURLM_OK)進入阻塞階段,     * 而不會在整個 $mh 批處理執行時不停地執行 curl_multi_exec 函數,白白浪費CPU資源。     */     if (curl_multi_select($mh) != -1) {      //程序退出阻塞狀態繼續執行需要處理的 $ch 句柄      do {        $mrc = curl_multi_exec($mh, $active);      } while ($mrc == CURLM_CALL_MULTI_PERFORM);    }  }    foreach ($chArr as $i=>$ch) {    //獲取某個curl句柄的返回值    $result[$i] = curl_multi_getcontent($ch);    //移除批處理句柄中的某個句柄資源    curl_multi_remove_handle($mh, $ch);  }  //關閉一組curl句柄  curl_multi_close($mh);  $endTime = microtime(true);  echo sprintf("use time: %.3f s".PHP_EOL, $endTime - $startTime);

 

use time: 0.599 s
 

通過對比上述程序的運行時間可以得知,使用curl_multi系列函數併發請求要比普通的curl函數依次請求效率高很多。



[sl_ivan ] 詳解PHP中curl已經有259次圍觀

http://coctec.com/docs/php/show-post-238065.html