婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳解PHP中curl_multi并發的實現

詳解PHP中curl_multi并發的實現

熱門標簽:臨沂crm外呼系統平臺 天客通地圖標注 菏澤語音外呼系統運營商 電子地圖標注怎么修改 如何在世界地圖標注 廈門400電話辦理選易號網 公司外呼系統中心 地圖標注符號樣式有 梧州市機器人外呼系統怎么樣

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; $i10; $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; $i10; $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并發的實現的文章就介紹到這了,更多相關PHP curl_multi并發內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

您可能感興趣的文章:
  • PHP下用Swoole實現Actor并發模型的方法
  • 淺談并發處理PHP進程間通信之System V IPC
  • 淺談并發處理PHP進程間通信之外部介質
  • PHP+Redis鏈表解決高并發下商品超賣問題(實現原理及步驟)
  • php多進程并發編程防止出現僵尸進程的方法分析
  • PHP高并發和大流量解決方案整理
  • PHP 并發場景的幾種解決方案
  • php多進程模擬并發事務產生的問題小結
  • 淺談Swoole并發編程的魅力

標簽:郴州 迪慶 黃石 貴陽 綿陽 雞西 白城 瀘州

巨人網絡通訊聲明:本文標題《詳解PHP中curl_multi并發的實現》,本文關鍵詞  詳解,PHP,中,curl,multi,并發,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解PHP中curl_multi并發的實現》相關的同類信息!
  • 本頁收集關于詳解PHP中curl_multi并發的實現的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 汽车| 郯城县| 庐江县| 和政县| 赤壁市| 井冈山市| 武穴市| 连州市| 达日县| 兰考县| 东兴市| 株洲市| 大港区| 鄂尔多斯市| 延边| 乌鲁木齐市| 宝应县| 宾川县| 阜康市| 承德县| 于田县| 都兰县| 东光县| 台湾省| 竹溪县| 邵东县| 鸡东县| 泸水县| 永州市| 七台河市| 邹城市| 土默特右旗| 淅川县| 河北区| 安阳县| 清丰县| 武胜县| 台中县| 黑河市| 荣成市| 和静县|