中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中curl_multi并發的實現方法

發布時間:2021-02-04 15:41:22 來源:億速云 閱讀:151 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關PHP中curl_multi并發的實現方法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

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; $i<10; $i++) {
  $chArr[$i] = curl_init();
  curl_setopt_array($chArr[$i], $optArr);
}
//創建批處理curl句柄
$mh = curl_multi_init();
//將單個curl句柄添加到批處理curl句柄中
foreach ($chArr as $ch) {
  curl_multi_add_handle($mh, $ch);
}
//判斷操作是否仍在執行的標識的引用
$active = null;
/**
 * 本次循環第一次處理 $mh 批處理中的 $ch 句柄,并將 $mh 批處理的執行狀態寫入 $active,
 * 當狀態值等于 CURLM_CALL_MULTI_PERFORM 時,表明數據還在寫入或讀取中,執行循環,
 * 當第一次 $ch 句柄的數據寫入或讀取成功后,狀態值變為 CURLM_OK ,跳出本次循環,進入下面的大循環中。
 */
do {
  //處理在批處理棧中的每一個句柄
  $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
/**
 * 上面這段代碼中,是可以直接使用 $active > 0 來作為 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函數依次請求效率高很多。

關于“PHP中curl_multi并發的實現方法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

嘉义县| 界首市| 武夷山市| 宁津县| 安康市| 中阳县| 宜兴市| 海宁市| 大连市| 正安县| 休宁县| 革吉县| 松原市| 九龙坡区| 遵化市| 平原县| 车致| 北宁市| 瑞丽市| 丹凤县| 水富县| 桃园市| 波密县| 故城县| 嵩明县| 九江市| 宝应县| 五峰| 个旧市| 巨野县| 台州市| 西乌珠穆沁旗| 招远市| 余江县| 涪陵区| 怀仁县| 汕尾市| 库尔勒市| 靖西县| 固安县| 洞口县|