主頁 > 知識(shí)庫 > 詳解PHP中curl_multi并發(fā)的實(shí)現(xiàn)

詳解PHP中curl_multi并發(fā)的實(shí)現(xiàn)

熱門標(biāo)簽:臨沂crm外呼系統(tǒng)平臺(tái) 天客通地圖標(biāo)注 菏澤語音外呼系統(tǒng)運(yùn)營(yíng)商 電子地圖標(biāo)注怎么修改 如何在世界地圖標(biāo)注 廈門400電話辦理選易號(hào)網(wǎng) 公司外呼系統(tǒng)中心 地圖標(biāo)注符號(hào)樣式有 梧州市機(jī)器人外呼系統(tǒng)怎么樣

PHP中的curl_multi系列函數(shù)可以實(shí)現(xiàn)同時(shí)請(qǐng)求多個(gè)URL來實(shí)現(xiàn)并發(fā),而不是像普通curl函數(shù)那樣請(qǐng)求后會(huì)阻塞,直到結(jié)果返回才進(jìn)行下一個(gè)請(qǐng)求。因此在批量請(qǐng)求URL時(shí)可通過curl_multi系列函數(shù)提升程序的運(yùn)行效率。

curl普通請(qǐng)求

$startTime = microtime(true);
$chArr = [];
$optArr = [
  CURLOPT_URL => 'http://www.httpbin.org/ip',
  CURLOPT_HEADER => 0,
  CURLOPT_RETURNTRANSFER => 1,
];
$result = [];

//創(chuàng)建多個(gè)curl資源并執(zhí)行
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并發(fā)請(qǐng)求

$startTime = microtime(true);
$chArr = [];
$optArr = [
  CURLOPT_URL => 'http://www.httpbin.org/ip',
  CURLOPT_HEADER => 0,
  CURLOPT_RETURNTRANSFER => 1,
];
$result = [];

//創(chuàng)建多個(gè)curl資源
for ($i=0; $i10; $i++) {
  $chArr[$i] = curl_init();
  curl_setopt_array($chArr[$i], $optArr);
}
//創(chuàng)建批處理curl句柄
$mh = curl_multi_init();
//將單個(gè)curl句柄添加到批處理curl句柄中
foreach ($chArr as $ch) {
  curl_multi_add_handle($mh, $ch);
}
//判斷操作是否仍在執(zhí)行的標(biāo)識(shí)的引用
$active = null;
/**
 * 本次循環(huán)第一次處理 $mh 批處理中的 $ch 句柄,并將 $mh 批處理的執(zhí)行狀態(tài)寫入 $active,
 * 當(dāng)狀態(tài)值等于 CURLM_CALL_MULTI_PERFORM 時(shí),表明數(shù)據(jù)還在寫入或讀取中,執(zhí)行循環(huán),
 * 當(dāng)?shù)谝淮?$ch 句柄的數(shù)據(jù)寫入或讀取成功后,狀態(tài)值變?yōu)?CURLM_OK ,跳出本次循環(huán),進(jìn)入下面的大循環(huán)中。
 */
do {
  //處理在批處理?xiàng)V械拿恳粋€(gè)句柄
  $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);
 * 此時(shí)如果整個(gè)批處理句柄沒有全部執(zhí)行完畢時(shí),系統(tǒng)會(huì)不停的執(zhí)行 curl_multi_exec 函數(shù),從而導(dǎo)致系統(tǒng)CPU占用會(huì)很高,
 * 因此一般不采用這種方案,可以通過 curl_multi_select 函數(shù)來達(dá)到?jīng)]有需要讀取的程序就阻塞住的目的。
 */

/**
 * $active 為 true 時(shí),即 $mh 批處理之中還有 $ch 句柄等待處理,
 * $mrc == CURLM_OK,即上一次 $ch 句柄的讀取或?qū)懭胍呀?jīng)執(zhí)行完畢。
 */
while ($active  $mrc == CURLM_OK) {
  /** 
   * 程序進(jìn)入阻塞狀態(tài),直到批處理中有活動(dòng)連接(即 $mh 批處理中還有可執(zhí)行的 $ch 句柄),
   * 這樣執(zhí)行的好處是 $mh 批處理中的 $ch 句柄會(huì)在讀取或?qū)懭霐?shù)據(jù)結(jié)束后($mrc == CURLM_OK)進(jìn)入阻塞階段,
   * 而不會(huì)在整個(gè) $mh 批處理執(zhí)行時(shí)不停地執(zhí)行 curl_multi_exec 函數(shù),白白浪費(fèi)CPU資源。
   */
   if (curl_multi_select($mh) != -1) {
    //程序退出阻塞狀態(tài)繼續(xù)執(zhí)行需要處理的 $ch 句柄
    do {
      $mrc = curl_multi_exec($mh, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  }
}

foreach ($chArr as $i=>$ch) {
  //獲取某個(gè)curl句柄的返回值
  $result[$i] = curl_multi_getcontent($ch);
  //移除批處理句柄中的某個(gè)句柄資源
  curl_multi_remove_handle($mh, $ch);
}
//關(guān)閉一組curl句柄
curl_multi_close($mh);
$endTime = microtime(true);
echo sprintf("use time: %.3f s".PHP_EOL, $endTime - $startTime);

use time: 0.599 s

通過對(duì)比上述程序的運(yùn)行時(shí)間可以得知,使用curl_multi系列函數(shù)并發(fā)請(qǐng)求要比普通的curl函數(shù)依次請(qǐng)求效率高很多。

到此這篇關(guān)于詳解PHP中curl_multi并發(fā)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)PHP curl_multi并發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

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

標(biāo)簽:郴州 迪慶 黃石 貴陽 綿陽 雞西 白城 瀘州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解PHP中curl_multi并發(fā)的實(shí)現(xiàn)》,本文關(guān)鍵詞  詳解,PHP,中,curl,multi,并發(fā),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解PHP中curl_multi并發(fā)的實(shí)現(xiàn)》相關(guān)的同類信息!
  • 本頁收集關(guān)于詳解PHP中curl_multi并發(fā)的實(shí)現(xiàn)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章